当前位置: 首页 > 面试题库 >

更好地“尝试”某些东西并捕获异常,或者测试是否有可能首先避免异常?

邓鸿彩
2023-03-14
问题内容

我应该测试if某些东西是有效的还是只是try为了做它并捕获异常?

  • 有没有可靠的文档说一种方法是首选?
  • 还有一种方法更 pythonic 吗?

例如,我应该:

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/exceptif/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