今天开始阅读一个python脚本写的开源工具,下面会将阅读中遇到的问题以及解决办法都记录在这一系列文档里面
第一天
今天遇到 python 捕捉异常的问题。相信很多python 开发人员,在编写python代码 的时候,都会遇到,明明语法没问题,逻辑没问题。但是程序执行到某一行就会崩溃。这个就是异常做的事情了。
那么什么是异常?出现异常怎么办?如何捕捉异常?下面会一一回答
什么是异常
程序员永远无法,在编写代码的时候预料到程序执行是遇到的问题的所有情况。有些情况可能就只会导致结果错误,而有些则会导致程序崩溃。异常就是其中之一。
程序在执行时由于一些参数错误,可能导致在执行时,到出现非常严重的问题。那么对于程序来说如何解决呢?要么就是直接崩溃,还有一种比较人性化的措施就是抛出异常。通过抛出的异常,程序员可以知道是什么原因导致的问题。这个就是异常的由来。
举个例子:
# -*- coding:utf-8 -*-
'''
正常输入数字,都是没有问题的。但是假如你输入0,或者字母。就会有异常
'''
# from tkinter import EXCEPTION
class test1:
def test(self):
a = int(input("please input a num"))
res = 0/a # 0/0 是会抛异常。
print("res:",res)
print("end")
if __name__ == "__main__":
test = test1()
test.test()
当输入 0 的时候,就会出现异常
如何捕捉异常呢
看代码
# -*- coding:utf-8 -*-
'''
正常输入数字,都是没有问题的。但是假如你输入0,或者字母。就会有异常
'''
# from tkinter import EXCEPTION
class test1:
def test(self):
try:
a = int(input("please input a num"))
res = 0/a # 0/0 是会抛异常。
print("res:",res)
except Exception as e:
print("error is :", e)
print("jump to end")
print("end")
if __name__ == "__main__":
test = test1()
test.test()
如何自定义异常,以及抛出自定义异常?
# -*- coding:utf-8 -*-
'''
正常输入数字,都是没有问题的。但是假如你输入0,或者字母。就会有异常
'''
# from tkinter import EXCEPTION
class myExecpt(Exception): # 注意要继承 Exception 类
def __init__(self, *args): # 这里传入的参数时元组
self.args = args
class test1:
def test(self):
try:
a = int(input("please input a num"))
raise myExecpt("myExecpt except error") # 这里抛出异常
except myExecpt as e: # 这里捕捉 异常
print("error is :", e.args)
print("jump to end")
print("end")
if __name__ == "__main__":
test = test1()
test.test()
介绍一个 finally 语法。
举个例子:
# -*- coding:utf-8 -*-
'''
正常输入数字,都是没有问题的。但是假如你输入0,或者字母。就会有异常
'''
# from tkinter import EXCEPTION
class myExecpt(Exception): # 注意要继承 Exception 类
def __init__(self, *args): # 这里传入的参数时元组
self.args = args
class test1:
def test(self):
try:
a = int(input("please input a num"))
raise myExecpt("myExecpt except error") # 这里抛出异常
except myExecpt as e: # 这里捕捉 异常
print("error is :", e.args)
print("jump to end")
return "over"
finally:
print("end")
if __name__ == "__main__":
test = test1()
print(test.test())
结果:
please input a num1
('error is :', ('myExecpt except error',))
jump to end
end
over
很奇怪明明在except 的时候已经return 了。为什么还会执行 print(“end”).
finally 是和try 和 except 结合的语法。
以下内容来自Python官方文档Defining Clean-up Actions部分:
A finally clause is always executed before leaving the try statement, whether an exception has occurred or not. When an exception has occurred in the try clause and has not been handled by an except clause (or it has occurred in an except or else clause), it is re-raised after the finally clause has been executed. The finally clause is also executed “on the way out” when any other clause of the try statement is left via a break, continue or return statement.
大概总结一下:
1.finally代码块永远是try语句块中最后一个执行的
2.而当在try语句块或者except中遇到像return,break,exit()这类跳出循环或者终结程序的语句的时候,首先执行里面的内容,再执行finally语句块里的代码。
因为 finally 永远执行在 try 或这 except 之后。所以就算 except 中 return了,还是执行 finally
中的代码