How to properly ignore exceptions

前端 未结 11 2135
粉色の甜心
粉色の甜心 2020-11-22 02:18

When you just want to do a try-except without handling the exception, how do you do it in Python?

Is the following the right way to do it?

try:
    s         


        
相关标签:
11条回答
  • 2020-11-22 02:59

    For completeness:

    >>> def divide(x, y):
    ...     try:
    ...         result = x / y
    ...     except ZeroDivisionError:
    ...         print("division by zero!")
    ...     else:
    ...         print("result is", result)
    ...     finally:
    ...         print("executing finally clause")
    

    Also note that you can capture the exception like this:

    >>> try:
    ...     this_fails()
    ... except ZeroDivisionError as err:
    ...     print("Handling run-time error:", err)
    

    ...and re-raise the exception like this:

    >>> try:
    ...     raise NameError('HiThere')
    ... except NameError:
    ...     print('An exception flew by!')
    ...     raise
    

    ...examples from the python tutorial.

    0 讨论(0)
  • 2020-11-22 03:01

    It's generally considered best-practice to only catch the errors you are interested in. In the case of shutil.rmtree it's probably OSError:

    >>> shutil.rmtree("/fake/dir")
    Traceback (most recent call last):
        [...]
    OSError: [Errno 2] No such file or directory: '/fake/dir'
    

    If you want to silently ignore that error, you would do:

    try:
        shutil.rmtree(path)
    except OSError:
        pass
    

    Why? Say you (somehow) accidently pass the function an integer instead of a string, like:

    shutil.rmtree(2)
    

    It will give the error "TypeError: coercing to Unicode: need string or buffer, int found" - you probably don't want to ignore that, which can be difficult to debug.

    If you definitely want to ignore all errors, catch Exception rather than a bare except: statement. Again, why?

    Not specifying an exception catches every exception, including the SystemExit exception which for example sys.exit() uses:

    >>> try:
    ...     sys.exit(1)
    ... except:
    ...     pass
    ... 
    >>>
    

    Compare this to the following, which correctly exits:

    >>> try:
    ...     sys.exit(1)
    ... except Exception:
    ...     pass
    ... 
    shell:~$ 
    

    If you want to write ever better behaving code, the OSError exception can represent various errors, but in the example above we only want to ignore Errno 2, so we could be even more specific:

    import errno
    
    try:
        shutil.rmtree(path)
    except OSError as e:
        if e.errno != errno.ENOENT:
            # ignore "No such file or directory", but re-raise other errors
            raise
    
    0 讨论(0)
  • 2020-11-22 03:02

    In Python, we handle exceptions similar to other language, but the difference is some syntax difference, for example,

    try:
        #Your code in which exception can occur
    except <here we can put in a particular exception name>:
        # We can call that exception here also, like ZeroDivisionError()
        # now your code
    # We can put in a finally block also
    finally:
        # Your code...
    
    0 讨论(0)
  • When you just want to do a try catch without handling the exception, how do you do it in Python?

    It depends on what you mean by "handling."

    If you mean to catch it without taking any action, the code you posted will work.

    If you mean that you want to take action on an exception without stopping the exception from going up the stack, then you want something like this:

    try:
        do_something()
    except:
        handle_exception()
        raise  #re-raise the exact same exception that was thrown
    
    0 讨论(0)
  • 2020-11-22 03:08

    First I quote the answer of Jack o'Connor from this thread. The referenced thread got closed so I write here:

    "There's a new way to do this coming in Python 3.4:

    from contextlib import suppress
    
    with suppress(Exception):
        # your code
    

    Here's the commit that added it: http://hg.python.org/cpython/rev/406b47c64480

    And here's the author, Raymond Hettinger, talking about this and all sorts of other Python hotness: https://youtu.be/OSGv2VnC0go?t=43m23s

    My addition to this is the Python 2.7 equivalent:

    from contextlib import contextmanager
    
    @contextmanager
    def ignored(*exceptions):
        try:
            yield
        except exceptions:
            pass
    

    Then you use it like in Python 3.4:

    with ignored(Exception):
        # your code
    
    0 讨论(0)
提交回复
热议问题