程序的错误
语法错误,逻辑错误和运行时错误
- 语法错误是指源代码中的拼写等错误,这些错误导致python编译器无法把python源代码转换为字节码,故也称之为编译错误。
- 逻辑错误是程序可以执行(程序运行本身不报错)但执行结果不正确。对于逻辑错误,python解释器无能为力,需要根据结果来调试判断。
- 运行时错误是当:
1.程序中没有导入相关的模块(例如,import random)时,解释器将在运行时抛出NameError错误信息
2.程序中包括零除运算,解释器将在运行时抛出ZeroDivisionError错误信息
3.程序中试图打开不存在的文件,解释器将在运行时抛出FileNotFoundError错误信息
异常
异常指的是程序在没有语法错误的前提下,在运行期间产生的特定错误
每个指定错误都对应一个异常类对象,当产生某个特定错误时,其对应的异常类对象的实例对象就会被抛出
如果在程序中对抛出的异常实例对象不进行捕获和处理,程序就会停止运行,并且打印错误的详细信息,包括:
- Traceback,它指的是异常调用堆栈的跟踪信息,其中列出了程序中的相关行数。
- 对应的异常类对象的名称,以及异常的错误信息。
内置的异常类
所有内置异常类对象的基类是Exception
help(Exception)
>>>
>Help on class Exception in module builtins:
class Exception(BaseException)
| Common base class for all non-exit exceptions.
|
| Method resolution order:
| Exception
| BaseException
| object
|
| Methods defined here:
|
| __init__(self, /, *args, **kwargs)
| Initialize self. See help(type(self)) for accurate signature.
|
| ----------------------------------------------------------------------
| Static methods defined here:
|
| __new__(*args, **kwargs) from builtins.type
| Create and return a new object. See help(type) for accurate signature.
|
| ----------------------------------------------------------------------
| Methods inherited from BaseException:
|
| __delattr__(self, name, /)
| Implement delattr(self, name).
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __reduce__(...)
| Helper for pickle.
|
| __repr__(self, /)
| Return repr(self).
|
| __setattr__(self, name, value, /)
| Implement setattr(self, name, value).
|
| __setstate__(...)
|
| __str__(self, /)
| Return str(self).
|
| with_traceback(...)
| Exception.with_traceback(tb) --
| set self.__traceback__ to tb and return self.
|
| ----------------------------------------------------------------------
| Data descriptors inherited from BaseException:
|
| __cause__
| exception cause
|
| __context__
| exception context
|
| __dict__
|
| __suppress_context__
|
| __traceback__
|
| args
异常处理(try…except…else…finally结构)
try…except
try…except语句的语法格式:
try:
可能会产生异常的代码
except 异常类对象1:
当前except子句处理异常的代码
except 异常类对象2:
当前except子句处理异常的代码
…
except 异常类对象n:
当前except子句处理异常的代码
result = 1 / 0
print(result)
>>>
>---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-2-2a7c00a6da7f> in <module>()
----> 1 result = 1 / 0
2 print(result)
ZeroDivisionError: division by zero
try:
result = 1 / 0
print(result)
except ZeroDivisionError:
print("0不能作为除数!")
>>>
>0不能作为除数!
except后面的错误要注意类型
try:
result = 1 / 0
print(result)
except TypeError:#错误不对
print("0不能作为除数!")
>>>
>---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-4-4486f690affe> in <module>()
1 try:
----> 2 result = 1 / 0
3 print(result)
4 except TypeError:
5 print("0不能作为除数!")
ZeroDivisionError: division by zero
result = int('abc')
print(result)
>>>
>---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-5-960d03050136> in <module>()
----> 1 result = int('abc')
2 print(result)
ValueError: invalid literal for int() with base 10: 'abc'
try:
result = 1 / 0
print(result)
except ArithmeticError:#ArithmeticError为ZeroDivisionError父类
print("数学错误")
>>>
>数学错误
如果捕获的异常之间有继承关系,则结果跟其顺序有关系
try:
result = 1 / 0
print(result)
except ArithmeticError:
print("数学错误")
except ZeroDivisionError:
print("0不能作为除数!")
>>>
>数学错误
try:
result = 1 / 0
print(result)
except ZeroDivisionError:
print("0不能作为除数!")
except ArithmeticError:
print("数学错误")
>>>
>0不能作为除数!
多种异常输出一个结果可以合并
try:
result = 1 / 0
print(result)
except (TypeError,ZeroDivisionError,ValueError):
print("运行出错了!")
>>>
>运行出错了!
try:
result = 1 / 0
print(result)
except ZeroDivisionError as err:
print(type(err))
print(err)
>>>
><class 'ZeroDivisionError'>
division by zero
try…except…else…
try:
可能会产生异常的代码
except 异常类对象1:
当前except子句处理异常的代码
except 异常类对象2:
当前except子句处理异常的代码
…
except 异常类对象n:
当前except子句处理异常的代码
else:
try语句块中没有产生异常时执行的代码
while True:
try:
x = int(input('请输入一个整数:'))
except ValueError:
print('无效的输入,请再次输入')
else:
print('输入的整数为:',x)
break
>>>
>请输入一个整数:a
无效的输入,请再次输入
请输入一个整数:b
无效的输入,请再次输入
请输入一个整数:s
无效的输入,请再次输入
请输入一个整数:6
输入的整数为: 6
try…except…finally…
try:
可能会产生异常的代码
except 异常类对象1:
当前except子句处理异常的代码
except 异常类对象2:
当前except子句处理异常的代码
…
except 异常类对象n:
当前except子句处理异常的代码
finally:
总会被执行的代码
- 通常在finally从句中释放资源
- 若except没有捕获异常,则运行finally,则终止且抛出没有被捕获到的异常
raise(手动抛出异常实例对象)
raise 异常类对象[([参数])]
如果没有传入参数,可以省略掉小括号。
raise ZeroDivisionError('0不能作为除数')
>>>
>---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-14-5b1ed144e826> in <module>()
----> 1 raise ZeroDivisionError('0不能作为除数')
ZeroDivisionError: 0不能作为除数
raise ZeroDivisionError()#无参数时,小括号可以省略
>>>
>---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-15-10ba4d062a9d> in <module>()
----> 1 raise ZeroDivisionError()
ZeroDivisionError:
raise Warning("哔!")
>>>
>---------------------------------------------------------------------------
Warning Traceback (most recent call last)
<ipython-input-16-98ba533ebbb8> in <module>()
----> 1 raise Warning("哔!")
Warning: 哔!
自定义异常
class MyException(Exception):
pass
raise MyException('bibibibibi~~')
>>>
>---------------------------------------------------------------------------
MyException Traceback (most recent call last)
<ipython-input-5-f791c2df0850> in <module>()
1 class MyException(Exception):
2 pass
----> 3 raise MyException('bibibibibi~~')
MyException: bibibibibi~~