这里需要注意的是错误是Error,异常是Exception。 异常是可以被捕捉的,被处理的,但是错误是不能被捕获的。异常官方文档
❝我们一般情况下,习惯性的叫pycharm控制台给出的红色字体叫报错。其实不然,是异常。
❞
异常产生: raise语句显示的抛出异常 Python解释器自己检测到的异常,并引发它
print(1/0)
"""print(1/0)
ZeroDivisionError: division by zero
"""
def fuc(num):if num == 1:raise Exception('错了呢')
fuc(1)
"""raise Exception('错了呢')
Exception: 错了呢
"""
看示例一中带有Error,实则并非正真的错误,它是由一层一层代码结构继承下来的,可以理解为继承自异常类下的Error类名。
捕获异常
try:print("正在捕捉")print(1/0)
except ZeroDivisionError:print("不可以除0")
"""
正在捕捉
不可以除0
"""
多个except
try:n = int(input('请输入一个数字:'))print(n)
except ValueError:print("输入整数啦")
except KeyError:print("key not found")
except FileNotFoundError:print("file not found")
:::danger 在try后面,可以接多个except,在异常后,会精准输出对应的异常提示。 :::
except与打印指定信息
正常情况下,except可以捕捉错误类型,且打印指定的错误信息
那么有没有一种方法可以直接访问捕捉异常呢,俗称:只想捕捉异常并直接打印对应信息。肯定有的
class Myexception(Exception):def __init__(self,code,message):self.code = codeself.message = messagetry:raise Myexception(code="404",message="Not")
except ValueError:print("输入整数啦")
except KeyError:print("key not found")
except FileNotFoundError:print("file not found")
except:print("我啥都捕捉")
"""
我啥都捕捉
"""
不论在何时都可以使用except。这里写的复杂例子后续还有其他内容要说。 Myexception继承自Exception,并且初始化了。这跟源码有关系。
不同层次的打印信息
❝正常情况下我们是直接捕捉错误并且print的。 还有另一种方式:
❞
class Myexception(Exception):def __init__(self,code,message):self.code = codeself.message = messagetry:raise Myexception(code="404",message="Not")
except ValueError:print("输入整数啦")
except KeyError:print("key not found")
except FileNotFoundError:print("file not found")
except Exception as e:print(e)print(e.code,e.message)print("我就是猖狂,我全部揽下来")
❝那就是as e的方式,我们需要在抛出异常的时候传入初始化参数,也就是报错提示,随后捕捉的时候使用.code,.message的方式输出。这里的e,也可以是其他的东西,类似于变量。
❞
finally
❝可以理解为只要写了它,不论如何都会执行先关语句。在退出try的时候总是会执行。
❞
try:f = open('test')
except ValueError as e:print(e.args,e.__dict__,sep='||')
except Exception as e:print(e.args,e.__dict__,sep='||')
finally:print("不论怎么样,我都会执行")
"""
(2, 'No such file or directory')||{}
不论怎么样,我都会执行
"""
❝可以看到即使异常了,也还是会执行的。sep的用法,请看零散小方法
❞
else
❝在没有异常的时候执行这个语句
❞
try:print(1//1)
except ValueError as e:print(e.args,e.__dict__,sep='||')
except Exception as e:print(e.args,e.__dict__,sep='||')
else:print("No Exception,action")
"""
1
No Exception,action
"""
finally和else
try:print(1//1)
except ValueError as e:print(e.args,e.__dict__,sep='||')
except Exception as e:print(e.args,e.__dict__,sep='||')
else:print("No Exception,action")
finally:print("Start Action , Show Time")
"""
1
No Exception,action
Start Action , Show Time
"""
❝这二者可以结合使用,此外你也可以在这其中加入一系列的代码,例如for循环,if判断等
❞
小结
❝1、如果try中语句执行时发生异常,搜索except子句,并执行第一个匹配该异常的except子句 2、如果try中语句执行时发生异常,却没有匹配的except子句,异常将被递交到外层的try,如果外层不处理这个异常,异常将继续向外层传递。如果都不处理该异常,则会传递到最外层,如果还没有处理,就终止异常所在的线程 3、如果在try执行时没有发生异常,如有else子句,可执行else子句中的语句 4、无论try中是否发生异常,finally子句最终都会执行
❞