python异常

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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值