python异常

目录

1. 常见异常类:

2.异常处理

try 语句按照如下方式工作;

finally的应用思路举例:

3. 抛出异常

 4.断言 assert:

5.自定义异常


 

 


1. 常见异常类:


   1)NameError:使用未定义变量
   2)ZeroDivisionError:分母为零
   3)SyntaxError:语法错误
   4)IndexError:索引超出范围
   5)KeyError:引用的字典键值错误
   6)FileNotFoundError:找不到文件
   7)AttributeError:类中没有属性
   8)AssertionError:断言异常 

>>> 10 * (1/0)             # 0 不能作为除数,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ZeroDivisionError: division by zero
>>> 4 + spam*3             # spam 未定义,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'spam' is not defined
>>> '2' + 2               # int 不能与 str 相加,触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

2.异常处理

a = [1,2,3]
print(a[6])  #如何避免此处的异常影响全局
print('zard')
"""
  pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "D:\pycharm2020\PyCharm 2020.1\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "D:/python_files/python_fiew/do_yicahng_01.py", line 2, in <module>
    print(a[6])
IndexError: list index out of range
"""

 

try 语句按照如下方式工作;

  • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。

  • 如果没有异常发生,忽略 except 子句,try 子句执行后结束。

  • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。

  • 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。

       一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。

     处理程序将只针对对应的 try 子句中的异常进行处理,而不是其他的 try 的处理程序中的异常。

number = int(input("请输入您要检索的索引数字:"))
a = [1,2,3]
try:
    print(a[number])
except:  #捕获异常
    print("存在异常时,此句会被执行!")
else:
    print('无异常,故此句会被执行。')
finally:
    print("无论是否有异常,此句都会被执行!")
print('zard')

"""
PyDev console: starting.
Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] on win32
runfile('D:/python_files/python_fiew/do_yicahng_01.py', wdir='D:/python_files/python_fiew')
请输入您要检索的索引数字:>? 6
存在异常时,此句会被执行!
无论是否有异常,此句都会被执行!
zard
"""

一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组,例如: 

except (RuntimeError, TypeError, NameError):
    pass

要能捕获所有异常,且可以打印出对应异常的信息,则利用所有异常的父类Exception: 

number = 6
a = [1,2,3]
try:
    print(a[number])
except Exception as e:  #捕获异常,将Exception命名为e
    print(e) #打印异常信息
else:
    print('无异常,故此句会被执行。')
finally:
    print("无论是否有异常,此句都会被执行!")
print('zard')

number = 6
a = [1,2,3]
try:
    print(a[number])
except Exception as e:  #捕获异常,将Exception命名为e
    print('Exception') #打印异常信息

except IndexError as i:
    print('IndexError')
finally:
    print("无论是否有异常,此句都会被执行!")
print('zard')
"""
PyDev console: starting.
Python 3.7.0 (default, Jun 28 2018, 08:04:48) [MSC v.1912 64 bit (AMD64)] on win32
runfile('D:/python_files/python_fiew/do_yicahng_01.py', wdir='D:/python_files/python_fiew')
Exception
无论是否有异常,此句都会被执行!
zard
"""
number = 6
a = [1,2,3]
try:
    print(a[number])
except IndexError as i:
    print('IndexError')
    
except Exception as e:  #捕获异常,将Exception命名为e
    print('Exception') #打印异常信息
finally:
    print("无论是否有异常,此句都会被执行!")
print('zard')

finally的应用思路举例:

a = [1,2,3]
try:
    f = open('file.log')  
    print(a[6])
except Exception as fnf_error:
        print(fnf_error)    
finally:
    f.close() #finally可用于释放文件操作

3. 抛出异常

def asd(age):
    if age < 0 or age >200:
        raise Exception("年龄太大或太小")
    print(age)

try:
    asd(231)
except:  #捕获异常
    pass

 4.断言 assert:

其优点在于将上述的抛出异常和捕获异常操作变成一步:

age = 0  
assert age < 0 or age > 200,"年龄不合法"

5.自定义异常

#自定义异常
#在继承父类Exception的基础上再自定义异常。相当于往Exception中添加新的异常
class AgeError(Exception):
    def __init__(self,info):
        self.info = info
    def show(self):
        print(self.info)
ageError = AgeError("年龄异常!") #实例化

age = -1
if age < 0:
    raise ageError

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Top Secret

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值