迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

在 Python 中创建自定义异常

作者:迹忆客 最近更新:2023/03/07 浏览次数:

本教程将演示你可以在 Python 中创建自定义异常类。在这里,我们将展示如何正确执行异常处理、定义自定义异常类以及覆盖现有的内置异常。

异常是一种事件,每当程序中的某些内容未按预期运行或中断程序预期用例的流程时就会发生。如果没有异常处理,程序将完全停止执行,并且必须修复或处理异常。

在 Python 中创建异常类的方式与创建常规类的方式相同。主要区别在于你必须包含 Python 的基类 Exception 以通知编译器你正在创建的类是异常类。

让我们测试这个方法以创建一个名为 DemoException 的异常类,并在内部使用占位符控制流关键字 pass 作为占位符。

class DemoException(Exception):
    pass

要测试 DemoException 类并查看它在实际触发时显示的内容,请执行异常引发。异常引发与其他编程语言中的异常抛出同义。

使用关键字 raise,使用给定的异常类触发异常并输出异常消息。

class DemoException(Exception):
    pass

raise DemoException

输出:

Traceback (most recent call last):
  File "/Users/demo/python/demo_exception.py", line 4, in <module>
    raise DemoException
__main__.DemoException

如果未声明自定义异常消息,则终端中将显示标准异常。

要为 DemoException 声明自定义异常消息,请覆盖异常类的 __init__() 方法,并在参数中包含应为异常输出的消息,以及强制自引用参数 self

例如,让我们覆盖 __init__() 方法并为 DemoException 类创建自定义消息:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)

请注意,要成功地将消息集成到你的异常中,请调用基本 Exception 类、__init__() 方法,并将 message 作为参数包含在内。

让我们再次使用 raise 关键字调用异常类,现在,使用它传递自定义消息:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)
        
message = "Exception Triggered! Something went wrong."
raise DemoException(message)

输出应如下所示:

Traceback (most recent call last):
  File "/Users/demo/python/helloworld.py", line 6, in <module>
    raise DemoException(message)
__main__.DemoException: Exception Triggered! Something went wrong.

我们现在已经成功创建并触发了一个带有自定义错误消息的异常类。

对于可能触发异常的实际情况,我们如何处理和引发这些异常?你可以通过使用 try...except 块实现异常处理来巧妙地解决这个问题。

try...except 块很像 Java 等其他语言中的 try-catch 块。

try...except 块有 2 个主要块和 2 个可选块:

让我们使用前面使用 DemoException 类的示例来尝试一个简单的 try...except 块。

首先,将 raise 关键字包装在一个函数中,并将其放入 try...except 块中。

我们将为此示例创建的函数是一个函数,它接受一个数字并在它发送 0 时抛出异常。如果它发送任何其他号码,则代码将按预期进行。参考下面的例子:

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)
        

message = "Exception Triggered! Something went wrong."

def triggerException(num):
    if (num == 0):
        raise DemoException(message)
    else:
        print(num)


try:
    triggerException(0)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

由于 triggerException()0 作为参数传递,代码应该触发 DemoException。在这里,我们应该期望 raise 关键字消息被 except 块内的任何内容作为输出覆盖。

请注意,未输出 triggerException() 函数调用后的 print() 行。这是因为函数引发了异常;因此,它立即停止了 try 块中的所有进程,并直接进入 except 块。

输出:

Error: Number should not be 0.

现在,让我们尝试传递一个有效的数字,例如 20

try:
    triggerException(20)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")

输出:

20
Code has successfully been executed.

让我们尝试链接 except 块并创建另一个异常。让我们调用新的异常 NumberFormatException,如果给定的输入不是数字就会触发。对于这个异常类,让我们在类中声明消息。

class NumberFormatException(Exception, value):
    message = f'{value} is not a number'
    def __init__(self):
        super().__init__(message)

现在,修改上面的代码来处理新的异常类 NumberFormatException

class DemoException(Exception):
    def __init__(self, message):
        super().__init__(message)
        
class NumberFormatException(Exception):
    def __init__(self, message, value):
        message = f'{value} is not a number'
        super().__init__(message)
        
message = "Exception occured."

def triggerException(num):
    if (not num.isdigit()):
        raise NumberFormatException(message, num)
    elif (num == 0):
        raise DemoException(message)
    else:
        print(num)

num = "sample string"
try:
    triggerException(num)
    print("Code has successfully been executed.")
except DemoException:
    print("Error: Number should not be 0.")
except NumberFormatException:
    print(num+" is not a number.")

在这段代码中,传递给 triggerException()num 的值是一个字符串'sample string',因此应该触发 NumberFormatException

输出:

sample string is not a number.

总之,在 Python 中创建自定义异常就像创建一个新类一样简单,但在类定义中将 Exception 类作为一个额外的参数。raise 关键字用于触发给定异常类的异常。try...except 块用于将一个或多个异常包装在一个代码块中,并在处理该异常时修改代码的作用,而不仅仅是完全关闭程序。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Django 中的 Slug

发布时间:2023/05/04 浏览次数:173 分类:Python

本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。

Django ALLOWED_HOSTS 介绍

发布时间:2023/05/04 浏览次数:181 分类:Python

本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。

Django 中的 Select_related 方法

发布时间:2023/05/04 浏览次数:129 分类:Python

本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。

在 Django 中上传媒体文件

发布时间:2023/05/04 浏览次数:198 分类:Python

在本文中,我们简要介绍了媒体文件以及如何在 Django 项目中操作媒体文件。

Django 返回 JSON

发布时间:2023/05/04 浏览次数:106 分类:Python

在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。

在 Django 中创建对象

发布时间:2023/05/04 浏览次数:59 分类:Python

本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。

在 Django 中为多项选择创建字段

发布时间:2023/05/04 浏览次数:75 分类:Python

在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便