Python中的异常处理raise案例介绍

 更新时间:2025年07月29日 09:32:14   作者:赵孝正  
本文讲解Python中手动抛出异常的raise语句用法,包括三种形式及异常处理流程,介绍如何通过traceback模块定位错误位置,帮助开发者有效管理程序异常,感兴趣的朋友跟随小编一起看看吧

0. 介绍

问题1: 是否可以在程序的指定位置手动抛出一个异常

答案是肯定的,Python 允许我们在程序中手动设置异常,使用 raise 语句即可。

问题2: 我们从来都是想方设法地让程序正常运行,为什么还要手动设置异常呢?

首先要分清楚程序发生异常和程序执行错误,它们完全是两码事,程序由于错误导致的运行异常,是需要程序员想办法解决的;但还有一些异常,是程序正常运行的结果,比如用 raise 手动引发的异常(比如1÷0没有意义,程序没有写错,但是这样运算不合理,就是异常)。

raise 语句的基本语法格式为:

raise [exceptionName [(reason)]]

其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述

如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。

也就是说,raise 语句有如下三种常用的用法:

  • raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
  • raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
  • raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。

代码测试

>>> raise
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    raise
RuntimeError: No active exception to reraise
>>> raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError
>>> raise ZeroDivisionError("除数不能为零")
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    raise ZeroDivisionError("除数不能为零")
ZeroDivisionError: 除数不能为零

1. raise 介绍(案例)

程序正常运行的时候,根据需要,用 raise 手动引发异常。

raise 语句引发的异常,通常用 try exceptelse finally)异常处理结构来捕获并进行处理。例如:

try:
    a = input("输入一个数:")
    #判断用户输入的是否为数字
    if(not a.isdigit()):
        raise ValueError("a 必须是数字")
except ValueError as e:
    print("引发异常:", repr(e))

当我们输入字母 a ,程序运行结果为:

runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test')
输入一个数:>? a
引发异常: ValueError('a 必须是数字')

当我们输入数字 8,程序运行结果为:

输入一个数:8

由上面示例可以看出,我们手动让程序引发异常,很多时候并不是为了让其崩溃。

2. raise 不需要参数(案例)

这里重点关注位于 except 块中的 raise

try:
    a = input("输入一个数:")
    if(not a.isdigit()):
        raise ValueError("a 必须是数字")
except ValueError as e:
    print("引发异常:", repr(e))
    raise

由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。当我们输入字母 a ,程序执行结果为:

In[2]: runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test')
输入一个数:a
引发异常: ValueError('a 必须是数字',)
Traceback (most recent call last):
  File "D:\python3.6\1.py", line 4, in <module>
    raise ValueError("a 必须是数字")
ValueError: a 必须是数字

这里重点关注位于 except 块中的 raise,由于在其之前我们已经手动引发了 ValueError 异常,因此这里当再使用 raise 语句时,它会再次引发一次。

3. raise:单独一个 raise(正常程序使用无参的 raise )

当在没有引发过异常的程序使用无参的 raise 语句时,它默认引发的是 RuntimeError 异常。例如:

try:
    a = input("输入一个数:")
    if(not a.isdigit()):
        raise
except RuntimeError as e:
    print("引发异常:", repr(e))

当我们输入字母 a ,程序执行结果为:

In[3]: runfile('E:/09-code/01-turbulence/test/test04.py', wdir='E:/09-code/01-turbulence/test')
输入一个数:>? a
引发异常: RuntimeError('No active exception to reraise')

4. 其它案例

4.1 案例1

def read_file(file, pattern):
    try:
        if file.endswith('rtd'):
            data = pd.read_csv(file, skiprows=41, sep=r'\t')
        elif file.endswith('csv'):
            data = pd.read_csv(file)
        else:
            raise ValueError("Unknown file type")
        data = extract_cols(data, pattern=pattern, file=file)
    except Exception as e:
        print(f"{os.path.basename(file).split('.')[0]}: {e}")
        data = pd.DataFrame()
    return data

4.2 案例2

def divide(a, b):
    return a/b
try:
    divide(1, 0)
except:
    print("divide by 0")
else:
    print("the code is no problem")
print("code after try catch,hello,world!")

输出结果

divide by 0
code after try catch,hello,world!

5. 处理流程

try:
  code    #需要判断是否会抛出异常的代码,如果没有异常处理,python会直接停止执行程序
except:  #这里会捕捉到上面代码中的异常,并根据异常抛出异常处理信息
#except ExceptionName,args:    #同时也可以接受异常名称和参数,针对不同形式的异常做处理
  code  #这里执行异常处理的相关代码,打印输出等
else:  #如果没有异常则执行else
  code  #try部分被正常执行后执行的代码
finally:
  code  #退出try语句块总会执行的程序

可以看到

  • 这里的 else 是和 try-catch 连用的,并且 else 只在 try 中代码没有异常的情况下执行,else 必须在 except 这句代码存在的时候才能出现。
  • finally 这个片段里面的代码是肯定在最后执行的,无论前面是否发生异常,最后总会执行finally片段内的代码。
  • 所以,正常的流程是:try 没有发生错误-》else 内的代码-》finally 中的代码。
  • 发生异常的流程是:try 中发生异常-》被 except 捕获并执行 except 片段中的代码-》执行 finally 中的代码。

6. 显示error位置

要在抛出异常时包含代码所在的位置,可以使用Python的traceback模块。这个模块可以获取异常发生时的堆栈信息,包括文件名和行号。

以下是一个示例代码,展示了如何在捕获异常时打印出详细的错误信息,包括代码所在的位置:

import traceback
try:
    # 假设这是可能会抛出异常的代码
    # 例如:result = 10 / 0  # 这将引发ZeroDivisionError
    result = 10 / 0
except Exception as e:
    # 获取异常信息和堆栈跟踪
    tb = traceback.format_exc()
    print(f"Error processing {filename}: {e}\nTraceback:\n{tb}")

在这个示例中,traceback.format_exc()会返回一个字符串,其中包含了异常的详细信息和堆栈跟踪,包括引发异常的文件名和行号。这样,就可以清楚地看到错误发生的位置。😊

错误信息如下:

Error processing : division by zero
Traceback:
Traceback (most recent call last):
  File "<ipython-input-5-6bef8f98af92>", line 6, in <module>
    result = 10 / 0
ZeroDivisionError: division by zero

总结

也就是说,raise 语句有如下三种常用的用法:

1.raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
2.raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
3.raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。

参考链接:
链接1

到此这篇关于Python中的异常处理raise案例介绍的文章就介绍到这了,更多相关python 异常处理raise内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python GUI实现PDF转Word功能

    Python GUI实现PDF转Word功能

    这篇文章主要介绍了如何使用 wxPython 创建一个简单的图形用户界面(GUI)应用程序,结合 pdf2docx 库,实现将 PDF 转换为 Word 文档的功能,需要的可以参考下
    2024-12-12
  • Python+Django+MySQL实现基于Web版的增删改查的示例代码

    Python+Django+MySQL实现基于Web版的增删改查的示例代码

    这篇文章主要介绍了Python+Django+MySQL实现基于Web版的增删改查的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Python中property函数用法实例分析

    Python中property函数用法实例分析

    这篇文章主要介绍了Python中property函数用法,结合实例形式分析了property函数的功能、参数、使用方法及相关操作注意事项,需要的朋友可以参考下
    2018-06-06
  • Python 实现交换矩阵的行示例

    Python 实现交换矩阵的行示例

    今天小编就为大家分享一篇Python 实现交换矩阵的行示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • 利用Python构建Flutter应用的教程详解

    利用Python构建Flutter应用的教程详解

    Flutter在软件研发领域是非常流行的,今天就让我们深入了解一下,用 Python构建flutter应用程序的世界,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • 神经网络理论基础及Python实现详解

    神经网络理论基础及Python实现详解

    这篇文章主要介绍了神经网络理论基础及Python实现详解,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • tensorflow从ckpt和从.pb文件读取变量的值方式

    tensorflow从ckpt和从.pb文件读取变量的值方式

    这篇文章主要介绍了tensorflow从ckpt和从.pb文件读取变量的值方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Flask类视图的基本用法及高级技巧

    Flask类视图的基本用法及高级技巧

    Flask的类视图提供了一种强大而灵活的方式来构建Web应用的业务逻辑,本文主要介绍了Flask类视图的基本用法及高级技巧,感兴趣的可以了解一下
    2024-01-01
  • 分享8 个常用pandas的 index设置

    分享8 个常用pandas的 index设置

    这篇文章主要介绍了分享8 个常用pandas的 index设置,pandas 中的 index 是行索引或行标签。行标签可以说是 pandas 的灵魂一签,支撑了 pandas 很多强大的业务功能,比如多个数据框的 join, merge 操作,自动对齐等,下面来看看文章得具体介绍吧
    2021-12-12
  • Pycharm运行时总是跳出Python Console问题

    Pycharm运行时总是跳出Python Console问题

    这篇文章主要介绍了Pycharm运行时总是跳出Python Console问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论