Python3 & 异常

2020-11-27  本文已影响0人  乘风破浪的姐姐

一、错误
语法错误:使用 Pycharm 工具编写 Python 程序,编译器就会检测出来并给予提示,因此,编写好的程序几乎不会出现错误。
逻辑错误:编译器不会提示,例如:0作为被除数

二、异常
Python 程序语法正确,在运行时,有可能发生错误,运行期检测到的错误被称为异常;大多数的异常都不会被程序处理,会以错误信息的形式展现。
1、捕获所有异常
语法:

try:
可能发⽣错误的代码
except:
如果出现异常执⾏的代码

2、捕获指定异常
语法:

try:
可能发⽣错误的代码
except <异常名>:
 如果出现异常执⾏的代码

3、万能异常
语法:

try:
 可能发⽣错误的代码
except Exception:
 如果出现异常执⾏的代码

4、捕获多个异常
1)不区分优先级
语法:

try:
  可能发⽣错误的代码
except (<异常名1>, <异常名2>, ...):
  如果出现异常执⾏的代码

2)区分优先级
语法:

try:
   可能发⽣错误的代码
except <异常名1>:
    如果出现异常执⾏的代码1
except <异常名2>:
     如果出现异常执⾏的代码2
except <异常名3>:
    如果出现异常执⾏的代码3

该种异常处理语法的规则是:
执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

3)处理多个异常(没有捕获异常就执行else语句)
如果判断完没有某些异常之后还想做其他事,就可以使用else语句。
else 子句只能出现在所有 except 子句之后,只有在没有出现异常时执行。
语法:

try:
    可能发⽣错误的代码
except <异常名1>:
     如果出现异常执⾏的代码1
except <异常名2>:
     如果出现异常执⾏的代码2
else:
     <语句>  # try语句中没有异常则执行此段代码

5、无论是否检测到异常,都会执行finally代码
1)try_finally 无论是否检测到异常,都会执行finally代码,主要为异常处理事件提供清理机制,用来关闭文件或者释放系统资源。
语法:

try:
    可能发⽣错误的代码
finally:
     要执行此段代码

2)try-except-finally使用
1.若try语句没有捕获异常,执行完try代码段后,执行finally
2.若try捕获异常,首先执行except处理错误,然后执行finally
finally 子句放在最后,无论是否出现异常都会执行。
语法:

try:
    可能发⽣错误的代码
except <异常名1>:
     如果出现异常执⾏的代码1
finally:
     要执行此段代码

3)try-except-else-finally使用
没有异常 try->else->finally
有异常 try->expect->finally
语法:

try:
    可能发⽣错误的代码
except <异常名>:
     如果出现异常执⾏的代码
else:
     <语句>  # try语句中没有异常则执行此段代码
finally:
     要执行此段代码

6、raise主动触发异常
可以使用raise语句自己触发异常,raise语法格式如下:
raise [Exception [, args [, traceback]]]
使用 raise 语句允许强制抛出一个指定的异常,要抛出的异常由 raise 的唯一参数标识,它必需是一个异常实例或异常类(继承自 Exception 的类)。
示例:

def not_zero(num):
    try:
        if num == 0:
            raise ValueError('参数错误')
        return num
    except Exception as e:
        print(e)
 
not_zero(0)

7、采用traceback模块查看异常
语法:

try:
    可能发⽣错误的代码
except:
    traceback.print_exc()

示例:

try:
   1/0
except Exception as e:
   print(e)

这样就会帮我们追溯到出错点:

Traceback (most recent call last):
 File "E:/workspaces/python/pythondemo/test/test2/异常.py", line 16, in <module>
   1 / 0
ZeroDivisionError: division by zero

8、自定义异常
在Python中,抛出⾃定义异常的语法为 raise 异常类对象 。
示例:

# ⾃定义异常类,继承Exception
class ShortInputError(Exception):
   def __init__(self, length, min_len):
       self.length = length
       self.min_len = min_len

   # 设置抛出异常的描述信息
   def __str__(self):
       return f'你输⼊的⻓度是{self.length}, 不能少于{self.min_len}个字符'


def main():
   try:
       con = input('请输⼊密码:')
       if len(con) < 3:
           raise ShortInputError(len(con), 3)
   except Exception as result:
       print(result)
   else:
       print('密码已经输⼊完成')

main()

输出结果:
请输⼊密码:2
你输⼊的⻓度是1, 不能少于3个字符

9、常见异常种类
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的

上一篇 下一篇

猜你喜欢

热点阅读