我应该测试if
某些东西是有效的还是只是try
为了做它并捕获异常?
例如,我应该:
if len(my_list) >= 4:
x = my_list[3]
else:
x = 'NO_ABC'
要么:
try:
x = my_list[3]
except IndexError:
x = 'NO_ABC'
一些想法…
PEP 20说:
错误绝不能默默传递。
除非明确地保持沉默。
应该使用atry
而不是anif
解释为无声传递的错误吗?如果是这样,您是否通过以这种方式使用它来明确使其静音,从而使其正常运行?
我 并不是 指只能以一种方式做事的情况;例如:
try:
import foo
except ImportError:
import baz
你应该更喜欢try/except
过if/else
如果结果
通常,这些并存。
加速
如果尝试通过以下方式在长列表中查找元素:
try:
x = my_list[index]
except IndexError:
x = 'NO_ABC'
当index
可能在列表中并且通常不引发IndexError时,尝试除外是最好的选择。这样一来,您无需再进行额外的查找if index < len(my_list)
。
Python鼓励使用异常, 您 可以使用Dive Into
Python中
的短语来 处理 异常 。您的示例不仅(优美地)处理异常,而不是让其 静默通过
,而且仅在未找到索引的 特殊 情况下才发生 异常 (因此,单词 异常 !)。
清洁代码
Python的官方文档提到了EAFP: 比起许可更容易获得宽恕 ,Rob
Knight指出 捕获错误而不是避免错误 可以使代码
更 简洁,更易于阅读。他的示例如下所示:
更糟 (LBYL“跳前先看”) :
#check whether int conversion will raise an error
if not isinstance(s, str) or not s.isdigit():
return None
elif len(s) > 10: #too many digits for int conversion
return None
else:
return int(s)
更好 (EAFP:寻求宽恕比获得许可更容易) :
try:
return int(s)
except (TypeError, ValueError, OverflowError): #int conversion failed
return None
问题内容: 试一试无用的东西只是看看此代码是否引发了特定的异常,这是一个好方法吗? 我想在引发异常时做点什么,否则就什么也不做。 有太多的先决条件要测试,构造函数BigDecimal()始终检查所有条件,因此这似乎是最简单的方法。 问题答案: 通常,应避免这种做法。但是,由于没有实用程序方法,所以这是要走的路。 正如Peter Tillemans在评论中指出的那样,将此代码放在称为的实用程序方法中
前几天,我在我们的一个项目中看到一些代码,它们使用try-catch并重新抛出捕获的异常,如下所示: 除了catch块中的异常之外,没有做任何其他操作,所以我甚至不确定它为什么会被抛出。我看不出再次抛出同一个异常并对该异常不做任何处理有什么好处。 如果重新抛出catch块中捕获的异常,C#如何处理?它是否陷入了无限抛接球循环?还是说它最终会放弃试一试?
问题内容: 发生异常后,我可以返回执行try块吗?(目标是写得更少)例如: 与 问题答案: 不,你不能那样做。这就是Python具有其语法的方式。一旦由于异常而退出try块,就无法返回。 那for循环呢? 但是请注意,裸露裸露是不明智的做法。您应该改为捕获特定的异常。我之所以这么做,是因为在不知道方法可能会抛出什么异常的情况下,这是我所能做的。
有可能在SWIFT中捕捉异常吗?给定以下代码: 有可能防止异常使整个程序崩溃吗?也就是说,在Objective-C中,与以下内容相对应的Swift等价是什么:
问题内容: 最近,我遇到了一位程序员的代码,其中他在catch中有一条try-catch语句! 请原谅我无法粘贴实际代码,但是他所做的与以下内容类似: 我个人认为这是我见过的最差的代码!以1到10的比例,您认为我应该多久才能动一下脑子,还是我反应过度? 编辑:他实际上在抓捕中所做的事情,他正在执行一些操作,这些操作在初始尝试失败时可以/应该执行。我的问题是拥有干净的代码和可维护性。将异常从第一个c