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异常处理
句法
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
例
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
例
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