本文概述
可以将异常定义为程序中导致程序流中断的异常情况。
每当发生异常时, 程序都会停止执行, 因此不会执行其他代码。因此, 异常是python脚本无法解决的错误。
Python为我们提供了处理异常的方法, 以便可以在不中断代码的情况下执行代码的另一部分。但是, 如果我们不处理该异常, 则解释器不会执行在此之后存在的所有代码。
常见异常
下面列出了可以从普通python程序抛出的常见异常列表。
- ZeroDivisionError:在数字除以零时发生。
- NameError:找不到名称时发生。它可以是本地的或全局的。
- IndentationError:如果给出了不正确的缩进。
- IOError:输入输出操作失败时发生。
- EOFError:到达文件末尾且正在执行操作时发生。
没有处理异常的问题
正如我们已经讨论的那样, 异常是异常情况, 它会中断程序的执行。考虑以下示例。
例子
a = int(input("Enter a:"))
b = int(input("Enter b:"))
c = a/b;
print("a/b = %d"%c)
#other code:
print("Hi I am other part of the program")
输出
Enter a:10
Enter b:0
Traceback (most recent call last):
File "exception-test.py", line 3, in <module>
c = a/b;
ZeroDivisionError: division by zero
python中的异常处理
如果python程序包含可能引发异常的可疑代码, 则必须将该代码放在try块中。在try块之后必须加上except语句, 该语句包含一个代码块, 如果try块中有异常, 将执行该代码块。
句法
try:
#block of code
except Exception1:
#block of code
except Exception2:
#block of code
#other code
我们还可以将else语句与try-except语句一起使用, 如果没有异常发生在try块中, 则可以将要在场景中执行的代码放在其中。
下面给出将else语句与try-except语句结合使用的语法。
try:
#block of code
except Exception1:
#block of code
else:
#this code executes if no except block is executed
例子
try:
a = int(input("Enter a:"))
b = int(input("Enter b:"))
c = a/b;
print("a/b = %d"%c)
except Exception:
print("can't divide by zero")
else:
print("Hi I am else block")
输出
Enter a:10
Enter b:2
a/b = 5
Hi I am else block
异常的except语句
Python提供了不使用except语句不指定异常名称的灵活性。
考虑以下示例。
例子
try:
a = int(input("Enter a:"))
b = int(input("Enter b:"))
c = a/b;
print("a/b = %d"%c)
except:
print("can't divide by zero")
else:
print("Hi I am else block")
输出
Enter a:10
Enter b:0
can't divide by zero
要记住的要点
- Python方便我们不使用except语句指定异常。
- 我们可以在except语句中声明多个异常, 因为try块可能包含引发不同类型异常的语句。
- 我们还可以指定else块以及try-except语句, 如果try块中未引发异常, 则将执行该语句。
- 不引发异常的语句应放在else块内。
例子
try:
#this will throw an exception if the file doesn't exist.
fileptr = open("file.txt", "r")
except IOError:
print("File not found")
else:
print("The file opened successfully")
fileptr.close()
输出
File not found
声明多个异常
python允许我们使用except子句声明多个异常。在try块引发多个异常的情况下, 声明多个异常非常有用。
句法
try:
#block of code
except (<Exception 1>, <Exception 2>, <Exception 3>, ...<Exception n>)
#block of code
else:
#block of code
例子
try:
a=10/0;
except ArithmeticError, StandardError:
print "Arithmetic Exception"
else:
print "Successfully Done"
输出
Arithmetic Exception
finally块
我们可以将finally块与try块一起使用, 在其中, 我们可以调整在try语句引发异常之前必须执行的重要代码。
下面给出了使用finally块的语法。
句法
try:
# block of code
# this may throw an exception
finally:
# block of code
# this will always be executed
例子
try:
fileptr = open("file.txt", "r")
try:
fileptr.write("Hi I am good")
finally:
fileptr.close()
print("file closed")
except:
print("Error")
输出
file closed
Error
引发异常
使用python中的raise子句可以引发异常。下面给出了使用raise语句的语法。
句法
raise Exception_class, <value>
要记住的要点
- 要引发异常, 请使用raise语句。异常类名紧随其后。
- 可以为异常提供可以在括号中给出的值。
- 要访问值” as”, 请使用关键字。 ” e”用作存储异常值的参考变量。
例子
try:
age = int(input("Enter the age?"))
if age<18:
raise ValueError;
else:
print("the age is valid")
except ValueError:
print("The age is not valid")
输出
Enter the age?17
The age is not valid
例子
try:
a = int(input("Enter a?"))
b = int(input("Enter b?"))
if b is 0:
raise ArithmeticError;
else:
print("a/b = ", a/b)
except ArithmeticError:
print("The value of b can't be 0")
输出
Enter a?10
Enter b?0
The value of b can't be 0
自定义异常
python允许我们创建可以从程序引发并使用except子句捕获的异常。但是, 建议你在访问Python对象和类之后阅读本节。
考虑以下示例。
例子
class ErrorInCode(Exception):
def __init__(self, data):
self.data = data
def __str__(self):
return repr(self.data)
try:
raise ErrorInCode(2000)
except ErrorInCode as ae:
print("Received error:", ae.data)
输出
Received error: 2000
评论前必须登录!
注册