首页 > 解决方案 > 处理函数中的多个异常

问题描述

我有一个使用http.servertranslate()用 Python 3 编写的小型 Web 服务器,它在方法中调用函数,do_GET()如下所示:

class httpd(BaseHTTPRequestHandler):
    def do_GET(self):
        self.wfile.write(bytes(f'{translate(var[0])}', 'utf-8'))

现在在这个translate()函数中,我有几个条件语句tryexcept块,大致如下:

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

上面的代码被简化了,但原则上,如果发生异常,我会返回一个空字符串,因此如果发生异常,我的 Web 服务器不会向客户端返回任何内容。

有没有更易于管理的方法来处理这个问题?具体来说,我希望:


注意:这是这个现已删除的问题的副本。该帖子的解决方案包含在下面,但欢迎提供其他答案。

标签: pythonpython-3.xexceptionerror-handlingexception-handling

解决方案


我不确定在您的逻辑中是否绝对需要嵌套块,但我会尝试使用自定义类try的单个try块。Exception像这样的东西:

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 ""

推荐阅读