首页 > 其他分享 >32-异常捕获与抛出工具

32-异常捕获与抛出工具

时间:2024-02-27 20:12:58浏览次数:26  
标签:raise 32 捕获 子句 except try 抛出 suite 异常

异常捕获与抛出工具

即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。
运行期检测到的错误被称为异常。

大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:

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

抛出异常: raise 语句

当想要主动抛出异常时,可以使用 raise 语句,语法格式如下:

raise_stmt ::=  "raise" [expression ["from" expression]]

实现语法:

raise [Exception [, args [, traceback]]]

实现案例:

x = 10
if x > 5:
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))

执行以上代码会触发异常:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
Exception: x 不能大于 5。x 的值为: 10

注意:

如果不给 raise 参数,则 raise 会重新引发当前的异常(active exception)。

如果当前没有异常,则会引发 RuntimeError


异常处理:try 语句

try 语句可为一组语句指定异常处理句柄和/或清理代码,语法格式如下:

try_stmt  ::=  try1_stmt | try2_stmt | try3_stmt
try1_stmt ::=  "try" ":" suite
               ("except" [expression ["as" identifier]] ":" suite)+
               ["else" ":" suite]
               ["finally" ":" suite]
try2_stmt ::=  "try" ":" suite
               ("except" "*" expression ["as" identifier] ":" suite)+
               ["else" ":" suite]
               ["finally" ":" suite]
try3_stmt ::=  "try" ":" suite
               "finally" ":" suite

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

  • 首先,执行 try 子句。
  • 如果没有异常发生,且 else 子句存在则执行else子句。
  • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。
  • 如果 except 子句存在且异常的类型和 except 之后的名称相符,
    那么对应的 except 子句将被执行。
  • 如果一个异常没有捕获,那么这个异常将会传递给上层的 try 中。
  • 最后,执行finally 语句。结束后抛出未被except捕获的异常。

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

一个 except 子句可以同时处理多个异常,
将需要处理的异常打包成一个元组,例如:

except (RuntimeError, TypeError, NameError):
    pass

如果 except 后忽略异常名称,则会捕获所有类型的异常。

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

参考资料:

Python 文档:复合语句

菜鸟教程:Python3 错误与异常

标签:raise,32,捕获,子句,except,try,抛出,suite,异常
From: https://www.cnblogs.com/wanderoff-night/p/18033448

相关文章

  • esp32 VS Code环境搭建
    1清除旧的环境1.1删除已经安装过的espressidf残留环境1.2删除环境变量2安装Python环境https://www.python.org/downloads/需要注意将python添加至环境变量3安装ESP-IDF-tool离线包以管理员权限安装此工具包,且VSCode在安装过程中不要打开!!出现下列情况为安装成功......
  • 8*4点LED数显驱动IC/LED数码管显示驱动控制电路(芯片)-VK1650 可驱动32点的数显屏,与市
    产品品牌:永嘉微电/VINKA产品型号:VK1650封装形式:SOP16产品年份:新年份 概述:VK1650是一种带键盘扫描电路接口的LED驱动控制专用芯片,内部集成有数据锁存器、LED驱动、键盘扫描等电路。SEG脚接LED阳极,GRID脚接LED阴极,可支持8SEGx4GRID的点阵LED显示。最大支持7x4按键。本芯片性......
  • 捕获全局异常,并且把异常信息打印到日志中
    背景:工作中用到一些脚本,脚本把日志记录到文件中。新需求修改脚本后,难免引入一些异常,执行脚本会报错,但是日志文件中没有报错的详细信息,很难排查。1、不使用sys.excepthook时,执行下面代码会抛出异常,日志文件example.log不会记录异常信息。 #coding:utf-8importsysimportlog......
  • U332154 carbon 题解(期望)
    这题其实挺简单的......首先我们手模样例,对于第一组样例其实就是在1-n之间取一个数,求取到的数的期望。所以E(x)=\(\frac{1+n}{2}\)。对于第二组样例,我们首先将所有可能情况枚举出来:1010101010101010101099999999910888888889......
  • U329011 trie pi 题解
    花了2d打磨出来的题目,觉得很有意思。先讲点无关的,这道题有两版,但都是对要求的量进行改动。1.第一次要求的是y属性为a与y属性为b的两个节点的路径权值之和,对于要求的这个量,我们设v[i]为i到根节点的权值之和。那么我们先对a,b进行质因数分解,设dcg为a,b分解质因数后最长公共前缀的乘......
  • NanoFramework操作ESP32(一)_基础元器件篇(二十七)_ 气体质量、可燃气体、烟雾检测传感器
    一、元器件介绍1、针脚用途编号名称功能1GND电源地2+5V电源正3AO信号脚二、示例代码1、代码:元器件的针脚ESP32模块的针脚GND;供电脚-GND+5V;供电脚++5VAO;信号脚IO16   未完2、结果: ......
  • NanoFramework操作ESP32(一)_基础元器件篇(三十一)_ MPU6050陀螺仪模块
    一、元器件介绍    MPU-6050是InvenSense公司生产的一款六轴运动处理器,集成了3轴加速度计和3轴陀螺仪;内置的数字运动处理器(DMP)可以实现高级运动处理功能,如六轴运动融合、姿态估计等。这款传感器广泛应用于运动控制和测量领域,如无人机、智能手机、运动手环等。通信接口:I2C(......
  • 解决kali上安装wine32报错
    1.问题描述:解决kali上安装wine32报错,报错信息如下Thefollowingpackageshaveunmetdependencies:libglib2.0-0:i386:Depends:libpcre2-8-0:i386(>=10.22)butitisnotgoingtobeinstalledlibselinux1:i386:Depends:libpcre2-8-0:i386(>=10.22)butitisnot......
  • NanoFramework操作ESP32(一)_基础元器件篇(十三)_ SL620人体红外传感器
    一、元器件介绍1、针脚用途编号名称功能1GND电源地2+5V电源正3S信号脚;倾斜时输出低电平二、示例代码1、代码:元器件的针脚ESP32模块的针脚GND;供电脚-GND+5V;供电脚++5VS;信号脚IO16 #regionKY-010光遮断传感......
  • CF1932 Codeforces Round 927 (Div. 3)
    E.FinalCountdown我愿称之为今年最傻逼的一次,思路很快想出来了,但是实现一直搞不对观察发现答案是n的所有前i位数相加(如12345,那么ans=12345+1234+123+12+1)要证明的话就是按照题目的Note那样算,(以12345为例,ans=(12345-1234-123-12-1)+21234+2123+212+21)然后傻逼的事情......