【问题标题】:Handle specific (for io) exception separately分别处理特定(对于 io)异常
【发布时间】:2015-11-13 09:13:10
【问题描述】:

一些 IO 操作会产生一些错误。重要的是,它不是一个例外,而是一组。所以,我们设置了套接字错误,设置了文件 io.不同io操作如何处理无交集的异常组?

例如,OSError 处理文件 io 错误和一些(?)套接字错误。

我只有一个解决方案:使用 try-except 包装 io 操作并引发用户定义的异常。

def foo():
    try:
        # some file io
    except:
        raise MyFileIOException(reason=sys.exc_info())

    try:
        # some socket io
    except:
        raise MySocketIOException(reason=sys.exc_info())

def bar():
    try:
        foo()
    except MyFileIOException as exc:
        # handle
    except MySocketIOException as exc:
        # handle

有没有更好更优雅的解决方案?

【问题讨论】:

    标签: python error-handling exception-handling


    【解决方案1】:

    我认为,您编写了一个不错的异常处理程序。此外,这取决于场景。比如说。如果您在库中创建一个函数,那么建议不要在库函数中引入任何应用程序/域特定的异常类型,而只是提出原始/本机异常类型。当应用程序代码将使用该函数时,它有责任声明自己的一组异常类型并将库中生成的异常包装到自己的类型中。

    例如。图书馆的代码

    def WriteToFile(strFile, strCnt):
      objFile = open(strFile, "w")
      objFile.write(strCnt)
      objFile.close()
    

    学生记录申请代码

    import library   # import our library in which SaveStudent is present
    import sys
    def SaveStudent(objStudent):
       try:
          WriteToFile("studentRec.txt", str(objStudent))
       except IOError as e:
          raise StudentSaveFailedException, None, sys.exc_info()[2]
    

    现在让这个异常在应用程序的 Exception-handler 组件中处理,它会有意义地处理这个异常并采取必要的纠正措施。

    虽然我知道这是一个幼稚的解释,但这是在大型应用程序中使用的策略,它使用多个内部和 3rd 方库来进行适当的异常处理。

    希望对你有帮助。

    【讨论】:

    • raise StudentSaveFailedException, None, sys.exc_info()[2]SyntaxError: invalid syntax
    • 哦,只有2个。知道了。
    【解决方案2】:

    我的结局是:

    def decorator(f):
        @functools.wraps(f)
        @asyncio.coroutine
        def wrapper(*args, **kwargs):
            try:
                return (yield from f(*args, **kwargs))
            except asyncio.CancelledError:
                raise
            except:
                raise CustomError(reason=sys.exc_info())
        return wrapper
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2012-11-26
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多