第9章 异常try...except...else...finally

异常

Python使用异常对象来表示异常状态,并在遇到错误时引发异常。异常对象未被处理(或捕获)时,程序将终止并显示一条错误信息(traceback)。

>>> 1 / 0
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ZeroDivisionError: division by zero

异常包含内置异常和自定义异常2种(没有本质区别,内置异常即Python已经定义且经常使用的异常,自定义异常则多与实际开发的业务有关)

内置异常

仅常见的内置异常,其实还有很多

BaseException                                 
+-- Exception                               
|    +-- AttributeError		引用属性或给它赋值失败时引发                   
|    +-- OSError             操作系统不能执行指定的任务时引发                
|    +-- IndexError			使用序列中不存在索引时引发
|    +-- KeyError			使用映射中不存在键时引发
|    +-- NameError			找不到名称(变量)时引发
|    +-- SyntaxError		代码不正确时引发
|    +-- TypeError			将内置操作或函数用于类型不正确的变量时引发
|    +-- ValueError          将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适
|    +-- ZeroDivisionError	 在除法或求模运算的第二个参数为零时引发
+-- KeyboardInterrupt                      
+-- SystemExit                               

自定义异常

class NewException(Exception):
    def __init__(self, errorInfo):
        super().__init__()
        self.errorInfo = errorInfo

    def __str__(self):
        return self.errorInfo

抛出异常

1raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常
注意:raise ... from None的用法

# 引发默认的RuntuimeError
raise
# Traceback (most recent call last):
#   File "C:/Users/shang/Desktop/pythonProject/main.py", line 1, in <module>
#     raise 
# RuntimeError: No active exception to reraise

# 1 / 0 的位置引发了ZeroDivisionError,raise将整个异常栈抛出
try:
    1 / 0
except ZeroDivisionError:
    raise
# Traceback (most recent call last):
#   File "C:/Users/shang/Desktop/pythonProject/main.py", line 2, in <module>
#     1 / 0
# ZeroDivisionError: division by zero

# 1 / 0 的位置引发了ZeroDivisionError,except ZeroDivisionError异常处理抛出了ValueError,except Exception通过raise将整个异常栈抛出
try:
    try:
        1 / 0
    except ZeroDivisionError:
        raise ValueError
except Exception:
    raise    
# Traceback (most recent call last):
#   File "C:/Users/shang/Desktop/pythonProject/main.py", line 3, in <module>
#     1 / 0
# ZeroDivisionError: division by zero
# 
# During handling of the above exception, another exception occurred:
# 
# Traceback (most recent call last):
#   File "C:/Users/shang/Desktop/pythonProject/main.py", line 5, in <module>
#     raise ValueError
# ValueError

# 通过raise ... from None来禁用上下文,raise并没有抛出整个异常栈而是从ValueError开始向外的异常栈
try:
    try:
        1 / 0
    except ZeroDivisionError:
        raise ValueError from None
except Exception:
    raise
# Traceback (most recent call last):
#   File "C:/Users/shang/Desktop/pythonProject/main.py", line 5, in <module>
#     raise ValueError from None
# ValueError

2raise ZeroDivisionError
# Traceback (most recent call last):
#   File "E:\anaconda\envs\py37tfcpu\lib\code.py", line 90, in runcode
#     exec(code, self.locals)
#   File "<input>", line 1, in <module>
# ZeroDivisionError

3raise ZeroDivisionError("除数不能为0")
# Traceback (most recent call last):
#   File "E:\anaconda\envs\py37tfcpu\lib\code.py", line 90, in runcode
#     exec(code, self.locals)
#   File "<input>", line 1, in <module>
# ZeroDivisionError: 除数不能为0

捕获异常

总体结构

# try块必选,except块&finally块二选一,else块可选
# try块中的代码出现异常,终止try块后面的代码执行转入except块
# try块中的代码未出现异常,执行完try块后转入else块
# try块中的代码无论是否出现异常,最后执行finally块
try:
    pass
except:
    pass
else:
    pass
finally:
    pass

except块

# 捕获所有异常,不建议使用,因为包含KeyboardInterrupt等
except:

# 捕获一种异常
except ZeroDivisionError:
    print("The second number can't bu zero!")

# 捕获多种异常
except ZeroDivisionError:
    print("The second number can't bu zero!")
except TypeError:
    print("That wasn't a number, was it?")

# 捕获多种异常
except (ZeroDivisionError, TypeError):
    print('Your numbers were bogus ...')
    
# 访问异常对象本身
except (ZeroDivisionError, TypeError) as e:
    print(e)

处理异常

1)不处理,程序将异常终止
1 / 0
print('Hello World')
# Traceback (most recent call last):
#   File "C:/Users/shang/Desktop/pythonProject/main.py", line 1, in <module>
#     1 / 0
# ZeroDivisionError: division by zero
# 
# Process finished with exit code 1

2)忽略,程序继续执行后面的语句
try:
    1 / 0
except Exception as e:
    pass
print('Hello World')
# Hello World
# 
# Process finished with exit code 0

3)处理,执行完except块的处理过程后,程序继续执行后面的语句
try:
    1 / 0
except Exception as e:
    print(e)
print('Hello World')
# division by zero
# Hello World
# 
# Process finished with exit code 0

4)抛出,交由外层的调用者处理
try:
    1 / 0
except Exception as e:
    raise 
print('Hello World')

警告

#使用warnings模块中的warn函数warn发出警告
>>>from warnings import warn
>>>warn("I've got a bad feeling about this.")
#警告只显示一次,如果再次运行最后一行代码,什么事情都不会发生
 
#使用warnings模块中的filterwarnings函数抑制警告(或特定类型的警告),并指定采取的措施,如"error"(警告)或"ignore"(忽略警告)
>>>from  warnings import filterwarnings
 
>>>filterwarnings("ignore")
>>>warn("Anyone out there?")
 
>>>filterwarnings("error")
>>>warn("Something is very wrong!")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UserWarning: Something is very wrong!
 
#发出警告时,可以指定要引发的警告类别(必须是Warning的子类,默认UserWarning)。
>>>filterwarnings("error")
>>>warn("This function is really old...", DeprecationWarning)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
DeprecationWarning: This function is really old...
#根据异常来过滤特定类型的警告
>>>filterwarnings("ignore", category=DeprecationWarning)
>>>warn("Another deprecation warning.", DeprecationWarning)
>>>warn("Something else.")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UserWarning: Something else.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MallocLu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值