代码之家  ›  专栏  ›  技术社区  ›  jpp

处理函数中的多个异常[已关闭]

  •  0
  • jpp  · 技术社区  · 7 年前

    http.server 调用函数 translate() in方法 do_GET() 这样地:

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

    现在在这里 翻译() 函数我有几个条件语句和 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
    

    有没有更容易处理的方法?具体来说,我希望:

    • 避免通过单独的 除了
    • 避免写多个 尝试 / 除了 语句,通常嵌套在函数中。

    注: 这是一份 this now deleted question . 这篇文章的解决方案包括在下面,但其他答案是受欢迎的。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Cartucho Vasyl    7 年前

    我不确定是否 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 ""
    
        2
  •  1
  •   jpp    7 年前

    怎么样 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)
    
        3
  •  0
  •   Ali Kargar    7 年前

    我们来定义一个函数,它有一个包含所有错误和响应的字典。在这种情况下,您可以捕获一次异常并将其发送给处理程序

    更新:

    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()