【问题标题】:Passing Errors Types into a Custom Error Handling Class, Python将错误类型传递给自定义错误处理类,Python
【发布时间】:2021-12-30 07:49:22
【问题描述】:

作为一名 Python 新手,我以有趣的方式解决问题。这就是其中之一。

我想将错误消息传递给错误处理脚本(一个类),这样我就可以自定义错误消息。例如,当引发“FileNotFoundError”时,我想显示/发送一条消息,例如“找不到 xxx 文件,请检查 yyy 目录。”。或者 'ConnectionResetError'、message ... 'Database connection restarted'.. 等等(大约 15 条不同的消息)。

因此,当引发异常时,我传递了错误:

   if __name__ == "__main__":
      try:
         do stuff...

       except Exception as e:
           ErrorHandlingClass.ErrorMessageHandler(e)

class ErrorMessageHandler:

     def __init__(self, error):
         err_type = str(type(error)) # obviously this is dumb
         err_type = (err_type[8:-2])

        if err_type == 'FileNotFoundError':
            print("Can not reach 'jconfig.json': {}".format(error))

首先,如何捕获例如'FileNotFoundError' 没有拉出字符串。

其次,专业的方式是什么?

第三,既然我需要一堆 if/elif 来生成唯一的消息,为什么还要麻烦一个特殊的类,只要放例如除了 FileNotFoundError as e... 具有唯一消息,并放在“main”下,并针对每个引发的错误类型执行 20 次?然后 main 变得乱七八糟。

谢谢

【问题讨论】:

    标签: python error-handling


    【解决方案1】:

    首先,异常是 Exception 基类的实例,可以用作异常……所以在您的处理程序中,您可以:

    def __init__(self, error):
        try:
            raise error 
        except FileNotFoundError:
            print("Can not reach 'jconfig.json': {}".format(error)
        except Exception as e:
            print(e)
    

    如果您坚持使用 if 语句,那么也许您可以使用 isinstance(obj, class) 代替字符串比较。所以在你的情况下if isinstance(error, FileNotFoundError): ...

    其次,如果您想集中错误处理,这没关系。这真的取决于你的代码。我不喜欢这种方式,因为控制仍然在 main 函数中,并且不清楚处理程序完成处理后会发生什么。你会exit(error_code_bigger_than_zero) 还是退出(0)。您是要raise e 获取 Python 错误跟踪以进行调试,还是要结束干净?

    第三。在 Python 中,最好创建做一件事并且做得很好的小函数。我认为你的 main 中不应该有任何东西,除了:

    if __name__ == “__main__”:
        main()
    

    当然函数 main() 应该定义在同一个文件或另一个文件的某个地方。

    【讨论】:

    • 感谢并感谢您的教育。 @MarkedAsDuplicate,我将 singledispatch 用于一堆我在其他地方使用的 if 语句。
    【解决方案2】:

    只需输入例如除了 FileNotFoundError as e... 具有唯一消息,并放在“main”下,并针对每个引发的错误类型执行 20 次?然后 main 变得乱七八糟。

    通常认为code smell 来管理针对不同对象类型的一长串 if 语句,在这种情况下是例外。避免这种情况的最常见方法是通过single dispatch。如果您的用例实际上需要一个类,请使用 @singledispatch@singledispatchmethod(它的工作原理与第一个基本相同,只是您将其用于类方法):

    from functools import singledispatch
    
    @singledispatch
    def handle(err):
        raise err  # pass on errors by default
    
    @handle.register(FileNotFoundError)
    def _(err):
        print('File not found!')  # do what you want here
    

    例如:

    try:
        raise FileNotFoundError
    except Exception as e:
        handle(e)  # prints 'File not found!'
    

    PS:在您的原始代码中,您不必将异常转换为字符串来检查其类型,您可以简单地使用isinstance(error, FileNotFoundError) 来检查您的异常对象是否属于指定的异常类。

    【讨论】:

      猜你喜欢
      • 2021-07-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      • 2020-04-28
      • 2019-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多