Python异常处理


 异常可以定义为程序中的异常情况,导致程序流程中断。

 每当发生异常时,程序都会暂停执行,因此不会执行其他代码。因此,一个例外是python脚本无法解决的错误。

 Python为我们提供了处理Exception的方法,以便可以在不中断的情况下执行代码的其他部分。但是,如果我们不处理异常,则解释器不会执行此后存在的所有代码。

 常见异常

下面给出了可以从普通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块中有异常,将执行该代码块。

 python-exception-handling.png

Python异常处理

句法

 

try:
#block of code
except Exception1:
#block of code
except Exception2:
#block of code
#other code

我们也可以在try-except语句中使用else语句,其中,如果try块中没有异常,我们可以放置将在场景中执行的代码。

 

下面给出了将else语句与try-except语句一起使用的语法。

 

 

try:
 
#block of code
 
 
 
except Exception1:
 
#block of code
 
 
 
else:
 
#this code executes if no except block is executed

 python-exception-handling2.png

 


 

 

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块中,我们可以调整必须在try语句抛出异常之前执行的重要代码。

 

下面给出了使用finally块的语法。

 

句法

 

try:
 
# block of code
 
# this may throw an exception
 
finally:
 
# block of code
 
# this will always be executed

 

 


 未命名图片.png

 

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