10.1异常
10.1.1常见异常
程序在运行时产生的错误称为异常。
在官网https://docs.python.org/3/library/exceptions.html中,对Python3中所有的内置异常进行了详细说明。其具体的层次结构如下:
BaseException(所有异常的基类)
+-- SystemExit(由sys.exit()引发,表示解释器请求退出)
+-- KeyboardInterrupt(用户中断程序的执行,在windows中输入Ctrl+c)
+-- GeneratorExit
+-- Exception(常规错误的异常)
+-- StopIteration(当迭代器的next()方法不指向任何对象时引发)
+-- StopAsyncIteration
+-- ArithmeticError(所有数值计算错误的基类)
| +-- FloatingPointError(浮点运算错误时引发)
| +-- OverflowError(当数值运算超出最高限制时引发)
| +-- ZeroDivisionError(当除运算/取模运算时,分母为0时引发)
+-- AssertionError
+-- AttributeError(对象属性引用失败或赋值失败时引发)
+-- BufferError
+-- EOFError(当input()函数在不读取任何数据的情况下到达文件结尾(eof)时引发)
+-- ImportError(当import语句在尝试加载模块遇到问题时引发,如模块未找到)
| +-- ModuleNotFoundError
+-- LookupError(在映射(字典)或序列中,使用键(key)或下标索引无效时引发)
| +-- IndexError(序列下标超出范围时引发)
| +-- KeyError(在映射(字典)中,使用key找不到对应的value)
+-- MemoryError
+-- NameError(在找不到局部/全局变量时引发)
| +-- UnboundLocalError
+-- OSError(当系统函数返回与系统相关的错误,如”文件未找到”等I/O错误时引发)
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError(weakref.proxy()创建的弱引用对象被回收后,仍被访问/引用时引发)
+-- RuntimeError(当生成的错误不属于其他任何类别时引发)
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError(当在Python发生语法错误时引发,如未缩进、标点符号为中文符号等)
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError(当函数/运算操作在使用不适当数据类型时引发)
+-- ValueError(当传入无效参数时引发)
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning(警告类别的基类)
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
10.1.2异常处理
#程序10-1
num = input('please input a number: ')
try:
a = int(num)
print('this number is %d'%a)
except ValueError:
print('it is not a number!')
运行结果:
please input a number: 12
this number is 12
程序10-1中,使用try/except关键字。程序会去执行try代码块中的语句,若发生异常则执行except语句,若未发生异常则不执行except语句。
在except中可以捕获发生的异常,若异常类型匹配,则执行此excpet语句。
#程序10-2
num = input('please input a number: ')
try:
a = int(num)
print('this number is %d'%a)
except ValueError as err:
print('ValueError:%s'%err)
运行结果:
please input a number: a
ValueError:invalid literal for int() with base 10: 'a'
在程序10-2种,在except后使用关键字as可以得到异常的打印信息。
#程序10-3
try:
a = int(num)
print('this number is %d'%a)
except ValueError as err:
print('ValueError:%s'%err)
except (NameError,TypeError):
print('Identification not found in global or local namespaces!')
运行结果:
Identification not found in global or local namespaces!
在程序10-3中,在except后可以使用元组,表示捕捉多个异常。
#程序10-4
try:
a = int(num)
print('this number is %d'%a)
except ValueError as err:
print('ValueError:%s'%err)
except:
print('it is other exception!')
运行结果:
it is other exception!
在程序10-4中,在except后不加任何异常类型,则表示捕捉其他任何异常。
#程序10-5
num = input('please input a number: ')