处理函数中的多个异常
Handling multiple exceptions in functions
我有一个用 Python 3 编写的微型网络服务器,使用 http.server 调用方法 do_GET()
中的函数 translate()
,如下所示:
class httpd(BaseHTTPRequestHandler):
def do_GET(self):
self.wfile.write(bytes(f'{translate(var[0])}', 'utf-8'))
现在在这个 translate()
函数中我有几个条件语句和 try
和 except
块大致如下:
def translate(param):
try:
# do something
except SomeError as some_err:
print("Error: " % some_err)
return ""
if True:
try:
# do something
except SomeOtherError as some_other_err:
print("Error: " % some_other_err)
return ""
except SomeThirdError as some_third_err:
print("Third error: " % some_third_err)
return ""
else:
# additional try and except blocks which print an error and
# return an empty string
上面的代码被简化了,但原则上如果发生异常我return一个空字符串,因此如果发生异常我的网络服务器return对客户端没有任何影响。
有没有更易于管理的方法来处理这个问题?具体来说,我希望:
- 避免通过单独的
except
部分捕获每个错误,同时仍支持依赖于错误类型的错误消息。
- 避免在我的函数中编写多个
try
/ except
语句,这些语句通常是嵌套的。
注:这是this now deleted question的副本。 post 的解决方案包含在下面,但欢迎其他答案。
contextmanager
怎么样?为了减轻您对自定义错误消息的担忧,您可以将字典映射错误 类 提供给您选择的消息。
由于不同的操作需要处理不同的错误,您可以使用多个 with
语句,每次输入不同的错误作为参数。
这是一个人为的例子:
from contextlib import contextmanager
@contextmanager
def error_handling(msg, *exceptions):
try:
yield
except exceptions as my_error:
print(msg[my_error.__class__], my_error)
return ''
def do_stuff(d, key, index):
custom_msg = {IndexError: 'You have an Index Error!',
KeyError: 'You have a Key Error!'}
with error_handling(custom_msg, IndexError, KeyError):
return d[key][index]
# example prints "You have an Index Error! list index out of range"; then returns ''
do_stuff({'a': [0, 1, 2]}, 'a', 10)
如何定义一个包含所有错误和响应的字典的函数。在这种情况下,您可以捕获一次异常并将其发送给处理程序
更新:
def handle (e) :
exp = {'IOError' : 'NO such a file in dir ...! ' ,
'KeyboardInterrupt' : 'Exiting ... (Keyboard interruption)',
'IndexError' : ' a sequence subscript is out of range' ,
'NameError' : 'a local or global name is not found'}
for key , value in exp.items() :
if e == key :
print (value) #or do whatever you want
def test() :
try :
f = open('no-file' , 'r')
except Exception as e :
handle (type(e).__name__)
if __name__ == "__main__" :
test()
我不确定嵌套 try
块在您的逻辑中是否绝对必要,但我会尝试使用自定义 Exception
[=16] 的单个 try
块=].像这样:
class MyException(Exception):
"""Generic error message."""
def __str__(self):
return self.__doc__
class SomeError(MyException):
"""SomeError message."""
pass
class SomeOtherError(MyException):
"""SomeOtherError message."""
pass
class SomeThirdError(MyException):
"""SomeThirdError message."""
pass
def translate(param):
try:
# do something
...
if cond1:
raise SomeError()
...
if cond2:
raise SomeOtherError()
...
if cond3:
raise SomeThirdError()
...
except MyException as err:
print(err)
return ""
我有一个用 Python 3 编写的微型网络服务器,使用 http.server 调用方法 do_GET()
中的函数 translate()
,如下所示:
class httpd(BaseHTTPRequestHandler):
def do_GET(self):
self.wfile.write(bytes(f'{translate(var[0])}', 'utf-8'))
现在在这个 translate()
函数中我有几个条件语句和 try
和 except
块大致如下:
def translate(param):
try:
# do something
except SomeError as some_err:
print("Error: " % some_err)
return ""
if True:
try:
# do something
except SomeOtherError as some_other_err:
print("Error: " % some_other_err)
return ""
except SomeThirdError as some_third_err:
print("Third error: " % some_third_err)
return ""
else:
# additional try and except blocks which print an error and
# return an empty string
上面的代码被简化了,但原则上如果发生异常我return一个空字符串,因此如果发生异常我的网络服务器return对客户端没有任何影响。
有没有更易于管理的方法来处理这个问题?具体来说,我希望:
- 避免通过单独的
except
部分捕获每个错误,同时仍支持依赖于错误类型的错误消息。 - 避免在我的函数中编写多个
try
/except
语句,这些语句通常是嵌套的。
注:这是this now deleted question的副本。 post 的解决方案包含在下面,但欢迎其他答案。
contextmanager
怎么样?为了减轻您对自定义错误消息的担忧,您可以将字典映射错误 类 提供给您选择的消息。
由于不同的操作需要处理不同的错误,您可以使用多个 with
语句,每次输入不同的错误作为参数。
这是一个人为的例子:
from contextlib import contextmanager
@contextmanager
def error_handling(msg, *exceptions):
try:
yield
except exceptions as my_error:
print(msg[my_error.__class__], my_error)
return ''
def do_stuff(d, key, index):
custom_msg = {IndexError: 'You have an Index Error!',
KeyError: 'You have a Key Error!'}
with error_handling(custom_msg, IndexError, KeyError):
return d[key][index]
# example prints "You have an Index Error! list index out of range"; then returns ''
do_stuff({'a': [0, 1, 2]}, 'a', 10)
如何定义一个包含所有错误和响应的字典的函数。在这种情况下,您可以捕获一次异常并将其发送给处理程序
更新:
def handle (e) :
exp = {'IOError' : 'NO such a file in dir ...! ' ,
'KeyboardInterrupt' : 'Exiting ... (Keyboard interruption)',
'IndexError' : ' a sequence subscript is out of range' ,
'NameError' : 'a local or global name is not found'}
for key , value in exp.items() :
if e == key :
print (value) #or do whatever you want
def test() :
try :
f = open('no-file' , 'r')
except Exception as e :
handle (type(e).__name__)
if __name__ == "__main__" :
test()
我不确定嵌套 try
块在您的逻辑中是否绝对必要,但我会尝试使用自定义 Exception
[=16] 的单个 try
块=].像这样:
class MyException(Exception):
"""Generic error message."""
def __str__(self):
return self.__doc__
class SomeError(MyException):
"""SomeError message."""
pass
class SomeOtherError(MyException):
"""SomeOtherError message."""
pass
class SomeThirdError(MyException):
"""SomeThirdError message."""
pass
def translate(param):
try:
# do something
...
if cond1:
raise SomeError()
...
if cond2:
raise SomeOtherError()
...
if cond3:
raise SomeThirdError()
...
except MyException as err:
print(err)
return ""