一、异常
python使用称为
异常
的特殊对象来管理程序执行期间发生的错误。每当发生让python不知所措的错误时,她都会创建一个异常对象。如果我们编写了处理该异常的代码,程序将继续运行;如果未对异常进行处理,程序将停止并显示traceback,其中包含有关异常的报告。
异常是使用try-except代码块处理的。try-except代码块让python执行指定的操作,同时告诉python发生异常时怎么办。使用try-except代码块时,即使出现异常程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。
1.处理ZeroDivisionError异常
我们都知道不能用数除以0,但是如果让python试一下这么做:
例
:
print(5/0)
输出结果;
在上述traceback中,,最后一行指出的错误ZeroDivisionError是个异常对象。python无法按照我们的要求做的时候,就会创建这种对象。
2.使用try-except代码块
当我们认为可能会发生错误时,可以编写一个try-except代码块来处理可能引发的异常。让python尝试运行一些代码,并告诉它如果这些代码引发了指定的异常该怎么办。
例
:编写一个try-except代码块处理ZeroDivisionError异常:
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
运行结果
:
将导致错误的代码行print(5/0)放在一个try代码块中。如果try代码块中的代码运行起来没有问题,python将跳过except代码块;如果try代码块中的代码导致了错误python将查找与之匹配的except代码块并运行其中的代码。
在本例中,try代码块中的代码引发了ZeroDivisionError异常,因此python查找指出了该怎么办的except代码块,并运行其中的代码。这样的话,出现错误时我们看到的就是一条友好的提示消息,而不是traceback。
如果try-except代码块后面还有其它代码,程序将接着运行
。
3.使用异常避免崩溃
发生错误时,如果程序还有工作尚未完成,妥善地处理错误就尤其重要。这种情况经常会出现在要求用户提供输入的程序中;如果程序能够妥善地处理无效输入,就能再提示用户提供有效输入,而不至于崩溃。
例
:创建一个只执行除法运算的简单计算器。
print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number = input("\nFirst number:")
if first_number == 'q':
break
second_number = input("Second number:")
if second_number == 'q':
break
answer = int(first_number) / int(second_number)
print(answer)
该程序没有采取任何处理错误的措施,因此在执行除数为0的除法运算时,他就会崩溃:
程序崩溃不是一件好事,让用户看到traceback也不好,不懂技术的用户看到会不知所措,怀有恶意的用户会通过traceback获取我们程序的一些信息。
比如,这些攻击者将会知道我们的程序文件名称,还将看到部分不能正确运行的代码。有时这些攻击者还可以根据这些信息判断出可以对我们的代码发起什么样的攻击。
4.else代码块
将可能引发错误的代码放在try-except代码块中,可提高程序抵御错误的能力。错误是执行除法运算的代码行导致的,因此需要将它放到try-except代码块中。
例
:将上例代码扩展,加入try-except代码块,并且包含一个else代码块,以来try代码块成功执行的代码都应该放到else代码块中。
print("Give me two numbers,and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number = input("\nFirst number:")
if first_number == 'q':
break
second_number = input("Second number:")
if second_number == 'q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by 0!")
else:
print(answer)
运行结果:
try-except-else代码块的工作原理:
python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放到try语句中。有时候,有一些仅在try代码块成功执行时才需要运行的代码,这些代码应放在else代码块中。