当你只想做一个try-except而不处理异常时,你在Python中如何做呢?
下面的方法是正确的吗?
try:
shutil.rmtree(path)
except:
pass
当你只想做一个try-except而不处理异常时,你在Python中如何做呢?
下面的方法是正确的吗?
try:
shutil.rmtree(path)
except:
pass
当前回答
完整性:
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
还要注意,你可以像这样捕获异常:
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print("Handling run-time error:", err)
...并像这样重新抛出异常:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
此外,多种异常类型可以作为圆括号元组来处理:
try:
i_might_fail()
except (ValueError, TypeError) as ex:
print('I failed with: ', ex)
...或作为单独的除条款:
try:
i_might_fail()
except ValueError:
print('handling a ValueError...')
except TypeError:
print('handling a TypeError...')
...请参阅python教程。
其他回答
通常认为最佳实践是只捕获您感兴趣的错误。在shutil的例子中。rmtree可能是OSError:
>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
[...]
OSError: [Errno 2] No such file or directory: '/fake/dir'
如果你想默默地忽略这个错误,你可以这样做:
try:
shutil.rmtree(path)
except OSError:
pass
为什么?假设你(以某种方式)不小心给函数传递了一个整数而不是字符串,比如:
shutil.rmtree(2)
它会给出错误“TypeError: coercing to Unicode: need string or buffer, int found”——你可能不想忽略它,这可能很难调试。
如果你确实想忽略所有错误,捕获Exception而不是一个裸的except:语句。再一次,为什么?
不指定异常会捕获每个异常,包括SystemExit异常,例如sys.exit()使用:
>>> try:
... sys.exit(1)
... except:
... pass
...
>>>
将其与正确退出的以下选项进行比较:
>>> try:
... sys.exit(1)
... except Exception:
... pass
...
shell:~$
如果你想编写更好的代码,OSError异常可以表示各种错误,但在上面的例子中,我们只想忽略Errno 2,所以我们可以更具体:
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
在Python中,我们处理异常的方式与其他语言类似,但区别在于语法上的不同,例如,
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...
我需要忽略多个命令和fuckit的错误
import fuckit
@fuckit
def helper():
print('before')
1/0
print('after1')
1/0
print('after2')
helper()
好吧,这不是一个try-except,但仍然是另一种处理异常的方法,如果你是面向对象编程:
class MyExceptionHandler:
def __enter__(self):
... # Do whatever when "with" block is started
return self
def __exit__(self, exc_type, exc_value, tb):
return True
然后是实际的代码:
with MyExceptionHandler():
... # Code that may or may not raise an exception
shutil.rmtree(path)
这是怎么回事?
__enter__在进入with块时运行。 __exit__在退出with块时运行 这应该返回True以关闭可能的异常。 这应该返回None(或被认为是False的东西),以避免关闭潜在的异常。 异常类型、实际异常及其回溯作为(位置)参数传递。你可以用这些来决定要做什么。
最后要注意的是,更喜欢try-except。如果您需要比平时更多的抽象,这可能会很有用。
完整性:
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print("division by zero!")
... else:
... print("result is", result)
... finally:
... print("executing finally clause")
还要注意,你可以像这样捕获异常:
>>> try:
... this_fails()
... except ZeroDivisionError as err:
... print("Handling run-time error:", err)
...并像这样重新抛出异常:
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
此外,多种异常类型可以作为圆括号元组来处理:
try:
i_might_fail()
except (ValueError, TypeError) as ex:
print('I failed with: ', ex)
...或作为单独的除条款:
try:
i_might_fail()
except ValueError:
print('handling a ValueError...')
except TypeError:
print('handling a TypeError...')
...请参阅python教程。