一、异常的语法
python的异常处理语法比较灵活,具有多种,掌握python异常处理的语法的关键是要明白,异常语法中的每个关键字的不同含义。只要我们明白关键字的含义,那么语法也只是一种组合而已。
try: f = open('/etc/passwd') print(f1) f.read() except OSError as err: print("OS error: {0}".format(err)) except Exception as err: print(err) else: print("all success") finally: f.close() print(f.closed)
输出:
name 'f1' is not defined True
在上面一段代码中我们有try except else finally 四个主要的关键字,我们先介绍try,try是告诉python解释器我下面的这些代码可能会出错,我需要异常处理,在我出错的时候将错误抛出。
except关键字后面接的是改段程序处理的异常类型,如果try语句块抛出的异常的类型是except可可接收的异常类型相同,那么except语句块就可以执行,如果不是就可以判断下一个except语句块。
else 关键字里面的语句,是所有的except语句块条件不满足,最后被执行的,也就是说我们的try语句块抛出了一个我们写的except语句块未检测到的异常类型。如果else语句之前的except语句块被执行了,那么else语句块就不会被执行。
finally是指在try语句块抛出异常之后,不论我们的except语句块,else语句块被执行与否,finally语句块都会被执行。
二、异常的类型
在python中我们的每一个异常类型都是一个类,我们在官网找到了所有异常类的继承关系树如下:
BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StopAsyncIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError | +-- ModuleNotFoundError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError +-- NameError | +-- UnboundLocalError +-- OSError | +-- BlockingIOError | +-- ChildProcessError | +-- ConnectionError | | +-- BrokenPipeError | | +-- ConnectionAbortedError | | +-- ConnectionRefusedError | | +-- ConnectionResetError | +-- FileExistsError | +-- FileNotFoundError | +-- InterruptedError | +-- IsADirectoryError | +-- NotADirectoryError | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError | +-- RecursionError +-- SyntaxError | +-- IndentationError | +-- TabError +-- SystemError +-- TypeError +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning +-- ResourceWarning
从上面的树形图我们可以看到,BaseException类是所有的异常类的基类。如果骂我们想要捕捉所有的系统自定义的异常类型,我们就可以使用 except BaseException:语句去实现。
下面一是一些官网的异常示例代码
try: file_it = open('/etc/group','r') print(file_it.read()) except Exception as e: print(e) #如果没有异常,则执行else 代码 else: print('all success') #不论是否有异常被抛出,finally的代码都会被执行 finally: file_it.close()
while True: try: x = int(input('Please enter a number:')) except ValueError: print('Oops! That was no valid number')
import sys try: file_it = open('/tmp/passwd') s = file_it.readline() i = int(s.strip()) print(a) except OSError as err: print('OS error:{0}'.format(err)) except ValueError: print('Could not convert data to integer.') except: print('Unexpected error:',sys.exc_info()[1]) else: print('all ok')三、自定义异常类型
如果我们需要抛出一个自己定义的异常,那么需要们定义一个继承于Exception的类如下面代码
class Error_Test(Exception): pass try: print('all is well') raise Error_Test('all is well') #Error_Test 类虽然没有构造函数,但是他的父类有 except Error_Test as err: print(err) finally: print('ok')raise 关键字用于程序员主动抛出异常,而不是在编译器报错的时候自动抛出异常,因此使用raise的try语句块抛出异常后,该语句块不一定有错误。