当前位置: 首页 > 知识库问答 >
问题:

如何捕获python中我没有定义的自定义异常

郭元凯
2023-03-14

我有以下try块:

try:
   # depending on conditions, this can generate several types of errors
   mymodule.do_stuff()
except Exception as e:
   print("something went wrong, the error was :" + type(e).__name__)

我想从do_stuff()捕获潜在的错误。经过反复试验,我能够生成一个潜在错误列表,这些错误可以通过打印它们的类型(e)由do_stuff()触发。__name__值:

DoStuffInsufficientMemoryException
DoStuffInsufficientCPUException
DoStuffInsufficientDiskException

但是如果我尝试将我的except语句从Exception as e修改为EXCEPTIONDOSTufficientMemoryException,我将得到一个错误,即未定义DOSTufficientMemoryException

我尝试定义一个类扩展异常为它,大多数教程/问题在这里建议,基本上:

class WAFInvalidParameterException(Exception):
    pass

现在这个变量已被识别,但由于我无法控制do_sutf()将引发的错误,因此我无法在我的初始try块中真正引发该异常。

理想情况下,我想有1除了块为每个错误,所以我想有这样的东西:

try:
   mymodule.do_stuff()
except DoStuffInsufficientMemoryException:
    free_memory()
except DoStuffInsufficientCPUException:
    kill_processes()
except DoStuffInsufficientDiskException:
    free_disk_space()

但是当然这不起作用,因为这些变量没有定义。

共有3个答案

孙朝明
2023-03-14

通常如果函数

module.foo()

抛出一个异常DoStuffInfunentMemoryExc0019,它也可以作为

from module import DoStuffInsufficientMemoryException

如果这导致重要错误,那么您需要这个答案中的fullname函数;将其与e一起使用(它接受一个实例并返回类名)。如果它给

foo.bar.DoStuffInsufficientMemoryException

然后,您可以将异常导入为

from foo.bar import DoStuffInsufficientMemoryException

上述情况可能并不适用于所有情况。一个值得注意的例子是Boto 3 AWS客户端库,它不使异常可导入-相反,它们将是客户端实例上的属性。

子车凌龙
2023-03-14

编辑:当然,您可以导入其他方法,而不是创建自己的方法

try/except块将尝试执行代码,如果在except语句中引发并指定了错误,它将停止执行try块中的代码,并执行except块中的其他代码。因此,要捕获自定义错误,首先必须提高它。

如果您不知道,可以使用raise语句引发错误。在这里,我制作了一段简单的代码。我有一个自定义错误,一个初始化为2的变量x,以及一个向参数中给定的变量添加1的方法。如果变量变为3,该方法将引发CustomError。

# Here, I define the custom error and allow a custom message to be displayed
# using the super() method

class CustomError(Exception):
    def __init__(self, msg):
        super().__init__(msg)


# I initialize x at 2
x = 2


# I create the method that will add 1 to the variable given in argument
# and raise a CustomError if the variable becomes 3
# This is completely random, and you can make whatever checks you want before raising
# Your custom error
def do_stuff(x):
    x += 1
    if x == 3:
        raise CustomError("x is 3")


# Now, I write the try/except block. I raise e (the CustomError) if it is
# being raised in the method do_stuff(x)
try:
    do_stuff(x)
except CustomError as e:
    raise e

请随意尝试代码,以更好地理解它!

欧桐
2023-03-14

就像你不能引用do_stuff而没有它的模块说明符一样,你必须指定在哪个模块命名空间中定义这些异常。

try:
    mymodule.do_stuff()
except mymodule.DoStuffInsufficientMemoryException:
    free_memory()
except mymodule.DoStuffInsufficientCPUException:
    kill_processes()
except mymodule.DoStuffInsufficientDiskException:
    free_disk_space()

如果free_memory也在my模块命名空间中,当然您也需要在那里指定它。

或者,在导入mymodule时,可以显式地将所选符号导入当前命名空间:

from mymodule import do_stuff, DoStuffInsufficientMemoryException, ...

然后,因为它们在当前包中,您可以(或者实际上必须)引用它们,而无需包前缀my模块。

设计良好的模块将导出选定的符号,这样您就可以在没有包前缀的情况下引用它们,但是这对您自己的包是否有意义取决于它的总体设计和预期受众。一些大型包为异常定义了一个单独的子包,因此您可以说

import bigpackage.exceptions

全部导入。您可能仍然希望浏览包的文档(或者,如果缺少源代码的话,也可以浏览包的源代码),以发现存在哪些异常以及它们是如何组织的。许多包定义了一个基本异常类,它的所有其他异常都是该类的子类,这样您就可以用一个符号轻松捕获所有异常,如

try:
    bigpackage.heavy_wizardry()
except bigpackage.BigBaseException:
    print("you are turned into a frog")
 类似资料:
  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 主要内容:前记,1.自定义视图,2.自定义异常,3.自定义异常的原理前记 在前面的文章中, 表示了视图解析的原理和异常解析器的解析原理。 这篇通过如何自定义视图和自定义异常处理和自定义异常处理的原理进行说明。 这里说明一下, 自定义的视图和自定义的异常都是会代替容器默认的组件的, 异常还好说, 就是不符合就抛, 视图的话需要注意一下优先级, 可以在自定义的视图解析器上加上注解。 1.自定义视图 这里原理就是添加一个视图和视图解析器, 然后放入容器中, 最后访问相应

  • 我使用的是SpringBoot2.3。我遇到了一些例外情况。我想使用类在全局级别捕获异常。我能够捕获验证错误并返回自定义错误响应,但Spring似乎忽略了我的方法。这是我的课程: andler.java 下面是我抛出异常的方法: PhotoStorageServiceImp.java PhotoUploadController.java } 我在检索照片时遇到错误

  • 这是由映射器捕获的。现在我要写: 这是捕捉所有意外异常并返回Jersey错误(错误代码)的正确方法吗?或者还有其他(更正确的)方式吗?

  • 问题内容: 我想在球衣休息服务中捕获所有意外的异常。因此我写了一个ExceptionMapper: 映射器实际上捕获了所有异常。因此,我不能写: 这是由映射器捕获的。现在我要写: 这是捕获所有意外异常并还返回球衣中的错误(错误代码)的正确方法吗?还是还有其他(更正确的)方法? 问题答案: 有一个我们可以从中得到的。因此,您可以在映射器中检查。也许像 这样,thrown 的实例将只返回默认响应。实际