1.常见的一些异常:
NameError: name 'abc' is not defined
ZeroDivisionError: division by zero
IndexError: list index out of range
SyntaxError: Missing parentheses in call to 'print'. Did you mean
SyntaxError: invalid character in identifier
TypeError: unsupported operand type(s) for +: 'int' and 'str'
ValueError: invalid literal for int() with base 10: 'a'
AttributeError: 'tuple' object has no attribute 'append
IndentationError: expected an indented block #indentation
FileNotFoundError: [Errno 2] No such file or directory: 'fasdfasfadf'
TypeError: 'int' object is not subscriptable
单行注释 # 多行注释单个单引号或者三个双引号 中文注释 在开头加#coding=utf-8或者#coding=gbk
2、简单应用
try:
1/0 #出现错误了
print("hello")#出错后不会执行下面两句,跳到外面执行下一句
print("hello")
except ZeroDivisionError:
print ("division by zero!")
print ("done!")
3、捕获对应的异常
try:
1/0 #出现错误了
print("hello")
print("hello")
except TypeError:
print ("error occur!")
except ZeroDivisionError:
print ("ZeroDivisionerror occur!")#捕获对应异常,执行except
print ("done!")
4、捕获一个异常后,后面不捕获了,执行报错下面的语句
“””except吴老说是拦截的意思,如果你把可能出现的异常拦截了,就会打印出你拦截的这块异常,同时还会执行后面的语句。如果你没拦截到这句异常,那程序找不到拦截信息就会抛出异常,后面的语句就不会被执行了。
try:
int("a") #出现错误了
print("hello")
print("hello")
except ValueError:
print ("value error!")
except ZeroDivisionError:
print ("ZeroDivisionerror occur!")
print ("done!")
异常只会被拦截一次,拦截后后面的except都不会被执行了
程序也会在执行except语句后,跳出try…except…
后继续执行后续的代码
5、例子:输入两个数字相加,打印结果
result = 0
num1 = input("please input your first name:")
num2 = input("please input your second name:")
try:
int(num1) or int(num2)
except ValueError:
print("value error1!")
#result = int(num1) + int(num2)
try:
result = int(num1) + int(num2)
except ValueError:
print("value error2!")
#print(result)
print("done")
(2)标准的
result =""
while 1:
try:
a= float(input("请输入数据a:"))
break
except:
print("输入的数据不是数字类型,请重新输入。")
while 1:
try:
b= float(input("请输入数据a:"))
break
except:
print("输入的数据不是数字类型,请重新输入。")
result = a+b
print (result)
6、异常的处理说明
#下面的except 只能兜底用,不能放下第一行,它代表你把所有的异常都捕获了,那么下面的except也白写了。它是你不知道还会出现什么异常的时候才用它,代表捕获所有异常。
try:
可能出错的代码块
except xxx异常1:
当异常出现时候的处理代码
except xxx异常2:
当异常出现时候的处理代码
except xxx异常3:
当异常出现时候的处理代码
except:
当异常出现时候的处理代码
try:
1/0
except TypeError:
print ("TypeError occur!")
except ValueError:
print ("ValueError occur!")
except:
print ("Unknown error occur!")
try:
1/0
except TypeError:
print ("TypeError occur!")
except ValueError:
print ("ValueError occur!")
except Exception as e:#其他信息存在这里
print (e)
#最后一句注释:你想看到具体异常的信息,加上具体异常的名字,再把它转化为一个对象,再打印这个对象。 这就是最后一句话的含义,在python3里才有了这个as 记住这个后面是Exception 不是原型 Except
7、嵌套
E:\>py -3 a.py
Traceback (most recent call last):
File "a.py", line 9, in <module>
func2()
File "a.py", line 6, in func2
func1()
File "a.py", line 2, in func1
1/0
ZeroDivisionError: division by zero
8、嵌套的例子
代码:
def func1():
1/0
def func2():
func1()
func2()
‘’’你可以用这种方式来更好的找出这个错误,完了过滤掉它,你比如:你执行上面这个代码,func2 找到func1 func1里面的谁呢,是1/0报的错,所以呢在编辑器里你能找到并看到这条信息,然后对你的代码进行修改,比如改成1/2 ‘’’
9、traceback报错打印出来(听下视频)
‘’’我怎么知道它是哪行出的错呢 那么就需要引入一个包了,这个包是traceback
traceback 的作用:在程序没有终止的时候,还把这个错误的异常堆栈信息给我
打印出来了。那么这个对于我进行,调试调错是不是很有帮助’’’
import traceback
def func1():
1/0
def func2():
func1()
try:
func2()
except Exception as e:
#print(traceback.format_exc())#返回字符串,print_exc()则直接给打印出来
traceback.print_exc()
print ("Done!")
10、抛出异常raise
想让它人为的出一个错。
import traceback#只是打印堆栈的错误
def func1():
if 1==1:
raise ZeroDivisionError#抛出异常
def func2():
func1()
try:
func2()
except:
#print(traceback.format_exc())#返回字符串,print_exc()则直接给打印出来
traceback.print_exc()
print ("Done!")
import traceback
except_info = ""
print("start:") #此语句被执行了
try:
open("e:\\xxxxx.txt") #此语句也被执行了,但是出错了,跳转到except部分去处理
print("complete compute!") #此语句被短路了
#在try里面的语句是顺序执行的
#当执行到某一句出错了,那么try后面的其他所有
#语句全部会被短路掉。
#出错的时候,会跳出try的代码块
except ZeroDivisionError: #拦截特定的异常 ZeroDivisionError。
except_info = traceback.format_exc()
print("除以0的异常出现了!")
except ValueError:
except_info = traceback.format_exc()
print("出现了值的异常")
except:
except_info = traceback.format_exc()
print("未知异常出现!")
else:#如果try里面没有发生任何异常,则else会被默认执行,否则不执行else
print("未发生异常!")
finally:
print("此句话不管有没有异常均被执行!")
print("end!") #因为出现异常了,所以此语句被短路了
print("出现的异常信息如下:",except_info)
#加了异常处理之后,程序可以全部执行完毕,并没有出现终止的情况。
总结:
1 异常不处理,会让程序中断
2 异常一般都是要使用try+except来拦截处理,保证不崩溃
3 拦截异常是个性异常在上,普遍异常在下,只要前面拦截到了,那么后续的异常拦截
就被默认短路了
4 except中如果也发生了异常,并没有被except,则程序也会崩溃
5 else 在未发生异常的时候会被处罚执行
6 finally不管发生还是不发生异常都会被执行,一般都是用于资源的释放和回收
7 可以自己使用raise来抛出指定的异常信息
8 如果想打印堆栈信息,要用traceback.print_exc,
获取报错堆栈信息的字符串,需要traceback.format_exc()