How to properly ignore exceptions

前端 未结 11 2254
粉色の甜心
粉色の甜心 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 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
    

提交回复
热议问题