某些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
有没有更优雅的解决方案?
答案 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