例如,当你需要在表中创建一个列,但表中没有这样的列时,使用什么?
我可以,如何编写代码来检查列是否存在,然后才添加它而不会出错,所以我可以尝试添加列而不检查,将方法包装在try-catch
( если есть
-将捕获异常;если нет
-该列将被添加)。
工作的结果将是相同的。
还有很多这样的例子,比如你可以检查文件是否存在,然后才复制,或者你可以捕获异常。
哪种方法更有效或更正确?
例如,当你需要在表中创建一个列,但表中没有这样的列时,使用什么?
我可以,如何编写代码来检查列是否存在,然后才添加它而不会出错,所以我可以尝试添加列而不检查,将方法包装在try-catch
( если есть
-将捕获异常;если нет
-该列将被添加)。
工作的结果将是相同的。
还有很多这样的例子,比如你可以检查文件是否存在,然后才复制,或者你可以捕获异常。
哪种方法更有效或更正确?
异常可以让您的代码更清晰、更易于理解,因为它们可用于将操作的执行与错误处理分开。Martin 的书“Clean Code”首先描述了这方面。
同时,以我的经验,分离代码是很有必要的:在单独的方法中取出
try
/块。catch
处理你的程序的程序员会说“谢谢”。这种构造非常笨重,即使是try
/的简单形式finally
,而且在大型方法的中间会让任何人感到困惑。异常的第二个优点是它们允许您传递附加信息。
atoi
C 函数无法说明它无法将字符串转换为整数的确切原因。在 Java 和 C# 等语言中,您可以通过将一些错误代码与调用上下文等结合起来,为您的异常类添加必要的属性。例子:
长期以来坚定地转向异常的开发人员通过不返回任何错误代码,特别是臭名昭著的null ,使他们的代码更加清晰:
目前,认为抛出异常更为正确(关于论据,我再次参考《代码整洁之道》一书)。如果该方法用于检查用户是否存在,建议将其转换为表单
TryX
。它很笨拙,但很熟悉,至少对 .NET 程序员来说是这样:更有价值的是,它是明确的:看代码,你不会想:“如果没有这样的用户怎么办?”
现在让我们从另一面看一下情况——什么时候不应该使用异常?在我看来,当它们使代码难以理解时。如果情况没有异常,那么在程序文本中应该有一个正常的检查。
例如,新文档的应用程序生成名称Untitled.foo、Untitled1.foo、Untitled2.foo等。
已经存在同名文件的情况很常见,并非例外,因此使用通常的检查来实现代码更正确:
这段代码不仅比使用异常的类似代码更快,更重要的是,它更容易被其他程序员理解,因为它隐含地向他们传达了额外的信息:这件事会定期发生,我们已经做好了准备。
但是,例如,一个文件夹中累积了 20 亿个无标题文件的令人难以置信的情况无疑是一个例外。
这段代码看起来比较混乱。幸运的是,我们可以将部分检查分配给 C# 编译器:
另一个规则从何而来:如果您了解语言、平台、库并依赖它们的异常,代码可以变得更清晰。
我在上面写过异常比检查慢,我想澄清我的观点:做决定时不要依赖性能。正确的意义传递给另一个程序员,代码的纯度才是自己应该追求的。性能差异虽然存在,但从来没有大到足以让用户注意到。好吧,除非您在某些图形引擎中为嵌套循环本身编写代码。
预检查速度更快,而且通常更准确。但只有异常处理才能提供充分的保证。
示例:简单的文件创建。这里的错误是可能的 - 大海:
所有这些选项都可以提前检查 - 并用俄语向用户提供明确的信息。
但是有一些情况是没有预检会抓到的: