常见异常:
1、语法错误(Syntax Errors)
语法错误,也就是解析时错误。当我们写出不符合python语法代码时,在解析时会报SyntaxError,并且会显示出错的那一行,并用小箭头知名指明最早探测到错误的位置。如:
>>> while Ture
File "<stdin>", line 1
while Ture
^
SyntaxError: invalid syntax
2、异常(Exceptios)
即使语句或表达式在语法上是正确的,但在尝试运行时也可能发生错误,运行时错误就叫做异常(Exceptions)。异常并不是致命的问题,因为我们可以在程序中对异常进行处理。
>>> 10 * (1 / 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 2 + x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> 2 + '2'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
上面显示了三种Exceptions的类型:ZeroDivisionError,NameError,TypeError,它们都是内置异常的名称。标准异常的名字就是内建的标识符(但并不是关键字)。
处理异常(try…except…)
我们可以使用try…except…语句来处理异常。try语句块中是要执行的语句,except语句块中是异常处理语句。一个try语句可以有多个except语句,用以指定不同的异常,但至多只有一个会被执行。
try:
x = int(input('please input a integer:'))
if 30 / x >5:
print("Hello world!")
except ValueError:
print('That was no valid number .Try again...')
except ZeroDivisionError:
print("The divior can not be zero .Try again...")
except:
print("Handling other exceptions...")
上面这段代码,当输入a(非数字)时,将抛出ValueError;
当输入0时,将抛出ZeroDivisionError;
当输入其他类型的异常时,将执行except:
后的处理语句。
如果在try执行时 ,出现了一个异常,该语句剩下部分将被跳过。并且如果该异常的类型匹配到了except后面的异常名,那么该except后的语句将被执行。注意如果except后面没有跟异常名,表示匹配任何类型的异常,except:必须放在最后。
一个except可以同时包括多个异常名,但需要用括号括起来,如:
>>> try:
... a = input()
... except (Runtime,TypeError,NameError):
... print("exception")
try…except…语句还可以有一个可选的else语句,else语句必须放在所有except语句之后,当没有异常发生的时候,else从句将被执行。
抛出异常
raise允许程序员强制地抛出一个特定的异常,例如:
>>> raise NameError #抛出异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError
raise抛出的异常必须是一个异常实例或类(派生自Exception的类)
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
...
An exception flew by!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
NameError: HiThere
清理动作(finally)
try语句有另一种可选的finally
从句,用于自定义一些扫尾清理工作。
与 else 从句的区别在于: else 语句只在没有异常发生的情况下执行,而 finally 语句则不管异常发生与否都会执行。准确的说,finally 语句总是在退出 try 语句前被执行,无论是正常退出、异常退出,还是通过break、continue、return退出。
>>> try:
... raise KeyboardInterrupt
... finally:
... print('Goodbye, world!')
...
Goodbye, world!
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyboardInterrupt
例子(来自实验楼)
目标
请在 /home/shiyanlou/Code写出一个 MinutesToHours.py 脚本文件,实现一个函数 Hours(),将用户输入的 分钟数 转化为 小时数和分钟数,并要求小时数尽量大。讲结果以 XX H, XX M 的形式打印出来。(注意打印格式中的空格)
要求
用户能够通过命令行输入分钟数,程序需要打印出相应的小时数和分钟数
如果用户输入的是一个负值,程序需要报错 ValueError
需要进行 try...except 操作来控制异常。如果异常,在屏幕上打印打印出 ValueError: Input number cannot be negative 提示用户输入的值有误
代码如下
#!/usr/bin/env python3
import sys
def Hours(m):
H,M = divmod(m,60) #得到一个商和余数的元组
return '{} H, {} M'.format(H,M)
try:
m = int(sys.argv[1]) #传入的第一个参数
if m < 0:
raise ValueError
else:
print(Hours(m))
except ValueError:
print('ValueError: Input number cannot be negative' )