Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 处理除一个异常以外的所有异常_Python_Exception_Exception Handling_Error Handling - Fatal编程技术网

Python 处理除一个异常以外的所有异常

Python 处理除一个异常以外的所有异常,python,exception,exception-handling,error-handling,Python,Exception,Exception Handling,Error Handling,如何处理除一个异常以外的所有异常 try: something except <any Exception except for a NoChildException>: # handling 答案是简单地做一个简单的提升: try: ... except NoChildException: # optionally, do some stuff here and then ... raise except Exception: #

如何处理除一个异常以外的所有异常

try:
    something
except <any Exception except for a NoChildException>:
    # handling

答案是简单地做一个简单的提升:

try:
    ...
except NoChildException:
    # optionally, do some stuff here and then ...
    raise
except Exception:
    # handling

这将重新引发上次抛出的异常,原始堆栈跟踪保持不变(即使它已被处理!)

我认为这是对公认答案的改进

try:
    dosomestuff()
except MySpecialException:
    ttype, value, traceback = sys.exc_info()
    raise ttype, value, traceback
except Exception as e:
    mse = convert_to_myspecialexception_with_local_context(e, context)
    raise mse

这种方法通过在捕获MySpecialException时保持原始stacktrace来改进已接受的答案,因此当您的顶级异常处理程序记录异常时,您将得到指向原始异常抛出位置的回溯。

我发现一个上下文,在该上下文中捕获所有错误(只有一个错误)并不是坏事,即单元测试

如果我有一个方法:

def my_method():
   try:
      something()
   except IOError, e:
      handle_it()
然后它可能会有一个单元测试,看起来像:

def test_my_method():
   try:
      my_module.my_method()
   except IOError, e:
      print "shouldn't see this error message"
      assert False
   except Exception, e:
      print "some other error message"
      assert False
   assert True

因为您现在检测到my_方法刚刚抛出了一个意外的异常。

Python新手。。。但这不是一个可行的答案吗? 我使用它,而且显然有效。。。。并且是线性的

try:
    something
except NoChildException:
    assert True
except Exception:
    # handling
例如,我使用它从os.mkdir中删除(在某些情况下无用)返回异常文件existserror

这就是我的代码:

try:
  os.mkdir(dbFileDir, mode=0o700)
except FileExistsError:
  assert True

我只是接受了一个事实,即dir无法以某种方式访问,这是执行的中止。

简单回答:不要。捕捉所有异常是一种非常糟糕的做法,因为您往往会捕捉到您无意捕捉的异常,从而掩盖错误。做这样的事只有少数合法的理由。你似乎已经回答了你自己的问题。告诉我们你为什么对你所拥有的不满意ᵩ 不完全是这样,他的示例将生成一个新异常,而不是重新引发旧异常。@Lattyware捕获所有异常没有问题-例如,添加额外的上下文,然后重新引发。然而,吞咽所有的异常(就像这个例子所做的),是不好的做法。我同意。但我明白了:Fail:Your Patient.update方法捕获了ZeroDivisionError类型的异常,而它本不应该捕获。除了代码中的子句外,永远不要使用裸的
。只捕捉提高的NoChildExceptions。而不是:成功忽略了类型为:ZeroDivisionError的引发异常成功忽略了类型为:NameError的引发异常成功忽略了类型为:AttributeError的引发异常成功忽略了类型为:TypeError的引发异常成功忽略了类型为:ValueError的引发异常成功捕获了引发的异常无核细胞感觉试验Completed@IvanVulović因此,您想要的是只捕获
NoChildException
s(这与您所要求的正好相反),所以只需执行
try:。。。除了NoChildException:…
,不需要任何花哨的东西。另外:除了e
/
raisee
。那会吞噬堆栈的痕迹。嗯,不。如果您不希望在测试中出现任何异常,请不要捕获任何异常。如果确实需要,请将
与self.assertRaises
一起使用,或将
与pytest.raises
一起使用,并在上下文管理器外部进行断言。您假设pytest是框架。错误的假设。不,我不是<代码>self.assertRaises是单元测试(stdlib)。NoTests现在已经被弃用了,pytest可能是最常见的测试框架。我想,如果听到你的弃用声明,网站上的人们会非常惊讶。尤其是因为Python不反对第三方库,这就提出了一个问题:“被谁反对?”。另外,由于没有对Python开发人员进行调查,我会非常犹豫是否要宣布哪一种是最受欢迎的,尤其是在成熟的产品中。回到测试的原点,你错过了,assertRaises没有解决,就是测试handle_it()是否正确处理异常。FWIW,我的观点甚至代表nose runner——在原始版本中有
nose.tools.assert\u raises
,在您提到的较新项目中有
nose.tools.assertRaises
。这在较旧版本的Python中起作用,但现在是
SyntaxError
try:
  os.mkdir(dbFileDir, mode=0o700)
except FileExistsError:
  assert True