python 【raise函数】

2023-11-05

一、raise函数的作用

抛出自定义的异常,stackoverflow社区里面常说的“Manually raising (throwing) an exception in Python”,这个manually解释的就很到位,是人工的,自己定义的异常。
有的人可能就感觉很奇怪了,我想让程序好好运行还来不及,怎么还想着运行错误呢?事实上,异常的种类有很多,对于python这个语言来说不是异常,但对于使用者或者programmer来说就是异常。举个简单例子,比如需要做个年龄输入,对于python来说,输入整数,小数都没有限制(只要programmer不限制)。但是从实际出发,不可能有小数的年纪。

二、raise函数使用举例

(1)raise函数常规使用方法举例

try:
  raise Exception
except Exception:
  #在这个输入遇到异常时的代码

**注意:**1)如果不使用try…except这种形式,那么直接抛出异常,不会执行后续代码。笔者认为这可能受制于python是解释性语言的原因。2)其中的Exception可以替换为各种系统内建错误。那么有哪些内建错误呢?在python中可以查看python官方文档,这个网站上详细给出了各种类型错误;或者在Google里面搜索“python built in exception”,都可以看到详细的系统内建的错误。
(2)运用raise函数抛出自定义异常


created by xiaolong date:20210507class ValueError(Exception):
   def __init__(self, age):
       self.age = age

   def __str__(self):
       return str(self.age)


age = input('请输入年龄:')
try:
      if int(age) < 0:
           *raise ValueError*
except ValueError as VE:
   print("输入的年龄小于零啦,age =", VE)

用法小结:1)raise后面可以直接跟一个class名,但是这个class必须是Exception的子类。2)__str__函数可以返回想要显示给用户的值。
(3)raise函数的一些其他用法
上面两种用法是常用的一些用法,下面介绍一些其他不同的raise抛出异常的语法。在stackoverflow问答这个网站里面介绍会比较详细。
1)只有一个raise

def somefunction():
    print("some cleaning")

a=10
b=0 
result=None

try:
    result=a/b
    print(result)

except Exception:            #Output ->
    somefunction()           #some cleaning
    raise                    #Traceback (most recent call last):
                             #File "python", line 8, in <module>
                             #ZeroDivisionError: division by zero

这里面就用到了一个单raise,他会自动re-raise,再次抛出上一个exception(异常)。如果先前没有异常,那么他就会抛出typeerror exception。
2)raise exception (args) from original_exception

class MyCustomException(Exception):
      pass

a=10
b=0 
reuslt=None
try:
    try:
        result=a/b

    except ZeroDivisionError as exp:
        print("ZeroDivisionError -- ",exp)
        raise MyCustomException("Zero Division ") from exp

except MyCustomException as exp:
        print("MyException",exp)
        print(exp.__cause__)

输出结果:

ZeroDivisionError --  division by zero
MyException Zero Division 
division by zero

这个raise exception (arg) from original_exception,作用是:exception能够从original_exception获取更多的信息。

三、需要注意的要点以及推荐用法

(1)需要注意的要点
1)可能会隐藏bug

def demo_bad_catch():
    try:
        raise ValueError('Represents a hidden bug, do not catch this')
        raise Exception('This is the exception you expect to handle')
    except Exception as error:
        print('Caught this error: ' + repr(error))

>>> demo_bad_catch()
Caught this error: ValueError('Represents a hidden bug, do not catch this',)

要点:避免使用非常概括的exception(比如上面例子中的ValueError),而使用比较具体的exception。
2)精确的except子句不会抓住非常概括的exception。

def demo_no_catch():
    try:
        raise Exception('general exceptions not caught by specific handling')
    except ValueError as e:
        print('we will not catch exception: Exception')
 

>>> demo_no_catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in demo_no_catch
Exception: general exceptions not caught by specific handling

(2)推荐用法
1)raise句子可以给随性所欲的arg,可以用好这些arg

raise ValueError('A very specific bad thing happened', 'foo', 'bar', 'baz') 
try:
    some_code_that_may_raise_our_value_error()
except ValueError as err:
    print(err.args)

output:
('message', 'foo', 'bar', 'baz') 

2)最好不要修改error。
你可以使用sys.exc_info()记录错误发生的type,, value,traceback,但是需要引用sys库。(语句为import sys)。最好不要修改sys.exc_info()中的内容,如果确实要修改可以把修改前的值赋给arg,保留在exception中。

import sys
def error():
    raise ValueError('oops!')

def catch_error_modify_message():
    try:
        error()
    except ValueError:
        error_type, error_value, traceback = sys.exc_info()
        print(error_type, error_value, traceback)
catch_error_modify_message()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 【raise函数】 的相关文章

  • 如何使用 Julia 查找矩阵中的连通分量

    假设我有以下矩阵 此处用 Julia 语言定义 mat 1 1 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 1 将一组值为 1 的相邻元素视为一个 分量 如何识别该矩阵有 2 个分量以及每个分量由哪些顶点组成 对于矩
  • 有没有办法在 Altair 箱线图中格式化工具提示值

    是否可以格式化箱线图工具提示中的值 由此织女星文档 https vega github io vega lite docs boxplot html tooltip encoding channels 看起来是这样 但我不太清楚如何使用 A
  • numpy:与索引数组有效求和

    假设我有 2 个矩阵 M 和 N 都有 gt 1 列 我还有一个索引矩阵 I 有 2 列 1 列代表 M 一列代表 N N 的索引是唯一的 但 M 的索引可能出现多次 我想要执行的操作是 for i j in w M i N j 除了 fo
  • 来自 Pandas DataFrame 的用户定义的 Json 格式

    我有一个 pandas dataFrame 打印 pandas DataFrame 后 结果如下所示 country branch no of employee total salary count DOB count email x a
  • argparse - 禁用相同参数的出现

    我正在尝试使用 argparse 禁用一个命令行中出现相同的参数 python3 argument1 something argument2 argument1 something else 这意味着这应该会引发错误 因为 argument
  • ImportError:无法导入名称 GstRtspServer,未找到内省类型库

    我目前正在尝试让一个简单的 GstRtspServer 程序在外部亚马逊 Linux EC2 服务器上运行 但在让它实际运行时遇到了严重的问题 无论我做什么 当我尝试运行它时 即使程序仅减少到 import gi gi require ve
  • 将函数应用于 3D numpy 数组

    我有一个来自 Image PIL Pillow 对象的 numpy 3D 数组 178 214 235 180 215 236 180 215 235 146 173 194 145 172 193 146 173 194 126 171
  • 使用 Pytest 捕获 SystemExit 消息

    我正在使用 pytest 编写测试 我遇到了一些函数抛出异常的情况SystemExit如果输入错误 终端上会显示一些错误消息 我想为以下情况编写测试SystemExit抛出并验证输出错误消息中是否有特定字符串 这是代码 def test v
  • PyGTK TreeView 中的自动换行

    如何在 PyGTK TreeView 中自动换行文本 gtk TreeView 中的文本是使用 gtk CellRendererText 渲染的 文本换行归结为在单元格渲染器上设置正确的属性 为了让文本换行 您需要设置wrap width单
  • iter(fp.readline, '') 中的行而不是 fp 中的行:

    我读了内置函数iter的例子在内置函数 Python 3 7 0 文档 https docs python org 3 library functions html iter with open mydata txt as fp for l
  • Pygame 旋转射击

    我和几个朋友一直在编写一种有趣的新射击机制 为了让它发挥作用 我们需要朝玩家面对的方向射击 Sprite 正在使用 Pygame Transform Rotate 进行旋转 我们怎样才能找到一个角度 然后朝那个方向发射子弹呢 这是我们的精灵
  • ModuleNotFoundError:没有名为“googleapiclient”的模块

    如果这是一个愚蠢的问题 我深表歉意 我在 stackoverflow 上搜索过 但没有找到解决办法 我正在致力于从 Python 2 7 迁移到 Python 3 8 我收到一个程序的以下错误 请帮我 Traceback most rece
  • 深度学习——一些关于caffe的幼稚问题

    我试图了解 caffe 的基础知识 特别是与 python 一起使用 我的理解是模型定义 比如给定的神经网络架构 必须包含在 prototxt file 当您使用数据训练模型时 prototxt 您将权重 模型参数保存到 caffemode
  • 如何使用 BeautifulSoup 只抓取可见的网页文本?

    基本上 我想用BeautifulSoup严格抓住可见文字在网页上 例如 这个网页 http www nytimes com 2009 12 21 us 21storm html是我的测试用例 我主要想获取正文 文章 甚至可能到处都有一些选项
  • Django populate() 不可重入

    当我尝试在生产环境中加载 Django 应用程序时 我不断收到此消息 我尝试了所有的 stackoverflow 答案 但没有任何解决办法 任何其他想法 我使用的是 Django 1 5 2 和 Apache Traceback most
  • 无法从 celery 信号连接到 celery 任务?

    我正在尝试连接task2 from task success signal from celery signals import task success from celery import Celery app Celery app t
  • 在IPython笔记本中自动播放声音

    我经常在 IPython 笔记本中运行长时间运行的单元 我希望笔记本在单元完成执行时自动发出蜂鸣声或播放声音 有没有办法在 iPython 笔记本中执行此操作 或者我可以在单元格末尾放置一些命令来自动播放声音 我正在使用 Chrome 如果
  • 连接 Flask Socket.IO Server 和 Flutter

    基本上 我有一个套接字 io 烧瓶代码 import cv2 import numpy as np from flask import Flask render template from flask socketio import Soc
  • python生成器太慢,无法使用它。我为什么要使用它?什么时候?

    最近我收到一个问题 哪一个是最快的 iterator list comprehension iter list comprehension and generator 然后编写简单的代码如下 n 1000000 iter a iter ra
  • 使用自定义层运行 Keras 模型时出现问题

    我目前正在攻读学士学位论文FIIT STU https www fiit stuba sk en html page id 749 其主要目标是尝试复制和验证以下结果study http arxiv org abs 2006 00885 这

随机推荐

  • ————博客永久废止————转到http://1su.net/nsB

    由于CSDN博客太难以管理 博主转向Ghost Blog Node的博客引擎 该博客永久废止 新的博客地址为http 1su net nsB
  • FutureTask 源码 并发设计模式

    一 代码 https www jianshu com p 60f661d95d53 public static void main String args throws Exception Callable
  • spring应用上下文的理解

    spring应用上下文的理解 容器 什么叫容器呢 如果你想要一个手机 好这时候spring就给你一个手机 你想要使用的对象 spring就会给你 但是现在我们就会问那spring给的对象来自于哪里呢 spring要负责的工作很多 那么多对象
  • Matlab矩阵

    1 通用的特殊矩阵 zeros函数 产生全0矩阵 ones函数 产生全1矩阵 eye函数 产生对角线为1的矩阵 当矩阵是方阵时 得到一个单位矩阵 rand函数 产生 0 1 区间均匀分布的随机矩阵 randn函数 产生均值为0 方差为1的标
  • Bootstrap统计学方法简介以及中心极限定理

    一 概念 Bootstrap 一词出自英文习语 pull yourself up by your bootstraps 它的隐含意是 improve your situation by your own efforts 即 通过你自己的努力
  • 163免费企业邮箱申请后怎么登陆?

    163免费企业邮箱目前的用户已经很多了 而关于申请的流程却并不多 很多人想用却不知道怎么注册申请 申请后又不清楚怎么登陆 下面小编为您讲解163免费企业邮箱注册申请及登陆流程 163免费企业邮箱注册申请 搜索163免费企业邮箱 打开企业邮箱
  • Git---企业级开发模型

    文章目录 前言 拓展 一 系统开发环境 二 Git分支设计规范 master分支 release分支 develop分支 feature分支 hotfix分支 三 企业级项目管理实战 准备工作 创建项目 创建仓库 添加成员 1 添加企业成员
  • redis分页查询代码实现

    redis分页查询 简单明了代码实现 本文是个基于redis的分页查询实现 场景描述 Redis分页自定义包装类 收藏和取消收藏biz业务处理 查询收藏数 查询用户收藏状态 分页查询我的收藏 本文是个基于redis的分页查询实现 本人业务开
  • 【JavaScript】Math 对象常见方法详解

    文章目录 JavaScript Math 对象常见方法详解 Math常见的方法 1 Math random 2 Math round 3 Math ceil 4 Math floor 5 Math abs 6 Math min 7 Math
  • Promise,async,await 面试题

    目录 5 面试题 1 2 3 4 5 6 7 推荐先看Promise 相关知识点 5 面试题 1 结果 1 5 2 3 4 const promise new Promise resolve reject gt console log 1
  • 前端自测运行vue打包后的dist文件

    在Vue项目中 dist目录是代码打包之后生成的文件夹 其中包含了静态资源文件和打包后的JavaScript CSS等文件 如果要在本地运行打包后的项目文件 可以使用简单的静态服务器来启动 下面介绍一种使用Node js中的http ser
  • 基于STC15单片机-LM35-DS8B20温度测量-DS1302计时-proteus仿真-源程序

    一 系统方案 1 本设计采用STC15单片机作为主控器 2 DS18B20采集温度值送到液晶1602显示 3 DS1302计时 日期送到液晶1602显示 4 LM35采集另一路温度值送到数码管显示 二 硬件设计 原理图如下 三 单片机软件设
  • Ubuntu16.04下 用Caffe训练自己的网络和模型并测试

    1 准备图片 训练太久就不放那么多图片了 在caffe根目录下data中新建文件夹6class 意思是6类 在6class文件夹下新建两个文件夹train和val train用来存放训练的图片 在train文件夹下新建6个文件夹0 5 图片
  • Base64编码图片转换成图片文件通用转换器(Java)

    Base64编码图片转换成图片文件通用转换器 Java 在本文中 我们将介绍如何使用Java实现将Base64编码的图片转换为图片文件的通用转换器 我们以将Base64编码转换为PNG图像文件为例 但同样的方法适用于其他图片格式 Base6
  • [LeetCode .213] House Robber II

    声明 题目来自Leetcode You are a professional robber planning to rob houses along a street Each house has a certain amount of m
  • java后台实现模拟登陆

    一 原理 客户端访问服务器 服务器通过Session对象记录会话 服务器可以指定一个唯一的session ID作为cookie来代表每个客户端 用来识别这个客户端接下来的请求 我们通过Chrome浏览器进行网页访问时 服务器会在我们第一次请
  • NFS服务器设置及mount命令挂载

    一 NFS服务器的设定 NFS服务器的设定可以通过 etc exports这个文件进行 设定格式如下 分享目录 主机名称或者IP 参数1 参数2 arm2410s 10 22 22 rw sync no root squash 可以设定的参
  • Charles使用教程

    Charles Charles 是一款收费的抓包修改工具 易上手 数据请求容易控制 修改简单 抓取数据的开始暂停方便等优势 下面详细介绍下这款强大好用的抓包工具 抓包 packet capture 就是将网络传输发送与接收的数据包进行截获
  • 在Win10中安装虚拟机:VMware Workstation Pro16+Ubuntu20.04

    引言 本篇首先在Win10中安装虚拟机工具软件VMware Workstation Pro 然后按照鸿蒙设备开发环境的要求 用VMware Workstation Pro创建一个虚拟机 最后在虚拟机上安装Ubuntu20 04系统 鸿蒙设备
  • python 【raise函数】

    一 raise函数的作用 抛出自定义的异常 stackoverflow社区里面常说的 Manually raising throwing an exception in Python 这个manually解释的就很到位 是人工的 自己定义的