错误与异常

程序的错误

语法错误,逻辑错误和运行时错误

语法错误是指源代码中的拼写等错误,这些错误导致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

1
2
3
4
5
6
7
8
9
10
11
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~~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值