分别处理特定(for io)异常

时间:2015-11-13 09:13:10

标签: python error-handling exception-handling

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

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

我只有一个解决方案:用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

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

2 个答案:

答案 0 :(得分:0)

我想,你已经编写了一个体面的异常处理程序。而且,这取决于场景。比如说。如果要在库中创建函数,则建议不要在库函数中引入任何特定于应用程序/域的异常类型,只需引发原始/本机异常类型。当应用程序代码将使用该函数时,它有责任声明自己的一组异常类型,并将库中生成的异常包装成它自己的类型。

例如。图书馆的代码

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

StudentRecord申请代码

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组件中处理,这将有意义地处理此异常并采取必要的纠正措施。

虽然我知道这是一个天真的解释,但这是大型应用程序中使用的策略,它使用几个内部和第三方库来进行适当的异常处理。

希望它对你有所帮助。

答案 1 :(得分:0)

我结束了:

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