我为什么要在Try-Catch中编写所有语句?


12

我的公司负责人说,我必须在Try-catch语句中编写all,即我的所有代码。现在,我可以在这里理解“安全胜于遗憾”的方法了,但是,当创建标签,设置表格位置时,认为会有例外是不是太胆小。在这样的简单操作中,有时会出现异常。


4
这听起来像是同一个人的嗡嗡声,他们说所有 SQL应该写为存储过程以提高性能。
海绵

5
您是否希望,“如果您的代码创建了运行时错误,则会被解雇。” 鸡肉游戏很有趣,直到您看到对手将方向盘和刹车踏板扔出窗户。
JeffO 2011年

4
@Jeff O-我实际上相信,在软件开发中,对手是货车。
Joris Timmermans

5
对于这种异常处理,我所听到的最好的表达是“将尸体钉在直立的位置”,这意味着它会使应用程序处于意外状态。快速失败,大声失败是一种更现代的方法,因此您实际上可以解决所有错误。
布鲁克

2
请求的主题无关紧要……只是说“我的公司负责人说我应该编码……”是一个很大的危险信号。这是微观管理……这不是他的工作。
JoelFan 2011年

Answers:


14

我的公司负责人说,我必须在Try-catch语句中编写所有代码,即所有代码。

好吧,这有点过头了,只会导致嘈杂的代码。用try catch处理程序编写所有代码(例如每个方法)有什么好处?它只是告诉您在大多数情况下有待解决的错误。通常,可以并且应该首先避免例外。

即使错误方法本身并不执行catch,堆栈外观跟踪也足以在代码中揭示原因。有时候,开发人员会破坏异常中的堆栈跟踪,但是当您有很多异常处理程序时,情况就更常见了。像任何东西一样:一点点是好的,但其中太多是有毒的。

异常处理确实非常简单:

捕获异常

  • 每当您需要采取特殊措施来应对异常时
  • 如果未处理,异常将使程序处于不一致状态

如果您考虑一下,那么通常只有一个地方可以很好地处理发生的异常。因此,处理程序应该在那个地方。

甚至不应该一开始就抛出许多异常,因此不要围绕异常处理构建您的控制结构,而应尽可能避免在任何时间和任何地方发生异常。

请记住,当事情(无法修复)出错时尽早崩溃。将所有代码放在try-catch语句中是荒谬的,但是不要忘记报告和记录所有异常。


+1不仅导致代码嘈杂,而且性能更差。当您将语句放在try块中时,HotSpot编译器将无法应用本来可以进行的优化。
奥利弗·韦勒

@Oliver Weiler:您是否引证了HotSpot编译器在try / catch块中没有进行的优化?
Kaypro II

16

但不是很胆大妄为地认为在创建标签,设置表格位置时会有例外。在这样的简单操作中,有时会出现异常。

绝对没错!总有一种您不会预料到的出错的方法。在这种情况下,“鸡胸肉”是一个荒谬的表达。软件开发并不是要通过忽略潜在问题来证明自己的男子气概。

什么一个有效的问题是它是否是有用的在您的编码标准说,他们必须将点捕获的异常。您的语句看起来就像您必须在每个方法主体周围都有try / catch块,这确实是荒谬的,因为您经常无法立即对异常执行某些有用的操作,而这实际上就是异常的全部要点:您可以选择让它们在适当的时候向上传播要处理的调用堆栈。


13
我的应用程序比抛出异常要了解得多,否则它们将一生被击败。一旦他们认为您很胆小,他们就会崩溃。
JeffO 2011年

@Michael Borgwardt:嘿,所以你不赞成我。您对这个问题不满意,唯一的不赞成是我的帖子。您的自我或自尊心似乎有严重的问题。我也注意到了其他姿态。您知道,其他程序员也有很好的答案。
猎鹰

@Falcon:我没有在这个问题上投票。我不知道是什么让您相信否则,但是如果有人有严重的自我问题,那就是您。
Michael Borgwardt

@Michael Borwardt:也许我错了。在这种情况下,我表示歉意。可能只是您对自己的问题的否决,导致我认为您在这里对此表示反对。抱歉。
猎鹰

8

我会反过来。是的,因为一般情况下,异常处理是一件好事,但是实际上您可以在捕获异常时以明智的方式处理所有可能的异常吗?有时,特别是如果您不是在编写关键任务软件时,最好在出现严重错误时以某种半路控制的方式简单地崩溃和刻录。

如果不能100%确定可以处理可能捕获的每个异常,则最好编写某种通用异常处理程序,将程序的主循环包装在其中-明确地知道该异常的确切机制取决于您使用的语言。在此处,尽可能记录有关异常的详细信息,保存程序状态(除了存储到用户当前正在使用的任何数据存储之外的其他位置 -记住,此时它可能已损坏) ), 等等。然后,重新抛出异常并让OS处理它认为合适的异常。在这个万能的异常处理程序中,为灾难性故障做好准备。然后,在重新启动程序时,请查看该状态是否有任何用处,并恢复可以恢复的状态。并可能会向用户发送错误报告给您。


5
+1:如果您无法立即正确处理异常,切勿捕获异常。(A,有时您必须捕获它,只是为了使其再次自由漫游,但被标记为另一种类型,作为API强制的一部分:我讨厌这一点。)
Donal Fellows

6

总体而言,不推荐使用try / catch,因为从资源的角度来看,catch块是如此昂贵。尝试/捕获用法使我想起了风险管理。风险管理具有两个方面:

  1. 发生风险的可能性
  2. 它可能造成的伤害

现在,如果您出门在外,那么一架钢琴落在您的头上的可能性很小(可能为0.001%),但是会杀死您。

异常处理就是这样。尝试块并不昂贵。但是catch块确实非常昂贵,因为它需要创建一个堆栈跟踪表并执行其他操作。因此,在做出有关try / catch块的决定时,应考虑可能击中catch块的次数。如果在10,000次使用中,您只击过1次,则使用它。但是,如果这是一种表单,并且用户可能没有正确填写50%次,那么您应该避免在其中执行try / catch块。

在发生异常的可能性很高的地方,建议使用if {} else {}块来避免发生异常。例如,您要除以两个数字,而不是写:

try
{
    int result = a/b;
}
catch (DivisionByZeroException ex)
{
    // Showing a message here, and logging of course.
}

您应该写:

if (b == 0)
{
    int result = a/b;
}
else
{
    // Showing a message to user to change the value of b, etc.
}

2
+1用于使用if / else处理“异常”,这些异常基本上只是应用程序逻辑。
Morgan Herlocker 2011年

如果与用户有关,请记住,计算机的速度要比人快得多。即使有许多用户,在50%的表单提交中引发的异常仍然极有可能每秒发生几次。
Donal Fellows,

1
我不同意避免使用try / catch块。不断尝试预期异常容易出错,在开发人员中花费大量时间,并使您的代码更难阅读。引发一百万个异常并捕获它们的循环需要500毫秒才能在我的计算机上运行(相比之下,空循环为1毫秒),这在99.99%的情况(和所有UI代码)中并不是真实的性能差异。您应该使用异常,除非您知道性能损失很重要,否则它们会使您的代码更可靠,并让您假定先前的代码已成功执行。
Kaypro II

@ cosmic.osmo,您检索堆栈跟踪还是只是捕获它?

3

您应该在适当的时候使用try-catch,但是请哦,请不要捕获所有异常,甚至不要记录它。到那时,它是代码臭味和伪劣的工作。


1
+1用于记录。狂野的程序是黑匣子。当它们失败时,记录“这是发生了什么”的日志对解决问题有很长的路要走。我的程序中有未报告的错误,只有在日志中找到它们后才发现它们。
Andrew Neely

2

我个人无法忍受例外,它们非常非常非常难以正确处理。试图破坏损坏的数据非常,非常,非常困难!

http://blogs.msdn.com/b/mgrier/archive/2004/02/18/75324.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2004/04/22/118161.aspx

http://blogs.msdn.com/b/oldnewthing/archive/2005/01/14/352949.aspx

http://www.joelonsoftware.com/items/2003/10/13.html

如果不调用每个函数,例如:

try
{
    TrivialFunction();
}
catch(TypeAException)
{
    //MaybeFix
}
catch(TypeBException)
{
    //MaybeFix
}
catch(TypeCException)
{
    //NO FIX - CORRUPT DATA
}
catch(TypeDException)
{
    //NO FIX - UNKNOWN STATE
}
catch(OutOfMemoryException)
{
    //Try to fix this one! Destructors might allocate on their own ;)
}
catch(Exception)
{
    //Nothing to see here, move on, everything is OK ;)
}

您不可能在每个出口处正确清理。例外是硬的!

异常的唯一好处是,如果您不捕获异常,则应用程序会因意外行为而崩溃。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.