我的公司负责人说,我必须在Try-catch语句中编写all,即我的所有代码。现在,我可以在这里理解“安全胜于遗憾”的方法了,但是,当创建标签,设置表格位置时,认为会有例外是不是太胆小。在这样的简单操作中,有时会出现异常。
我的公司负责人说,我必须在Try-catch语句中编写all,即我的所有代码。现在,我可以在这里理解“安全胜于遗憾”的方法了,但是,当创建标签,设置表格位置时,认为会有例外是不是太胆小。在这样的简单操作中,有时会出现异常。
Answers:
我的公司负责人说,我必须在Try-catch语句中编写所有代码,即所有代码。
好吧,这有点过头了,只会导致嘈杂的代码。用try catch处理程序编写所有代码(例如每个方法)有什么好处?它只是告诉您在大多数情况下有待解决的错误。通常,可以并且应该首先避免例外。
即使错误方法本身并不执行catch,堆栈外观跟踪也足以在代码中揭示原因。有时候,开发人员会破坏异常中的堆栈跟踪,但是当您有很多异常处理程序时,情况就更常见了。像任何东西一样:一点点是好的,但其中太多是有毒的。
异常处理确实非常简单:
捕获异常
如果您考虑一下,那么通常只有一个地方可以很好地处理发生的异常。因此,处理程序应该在那个地方。
甚至不应该一开始就抛出许多异常,因此不要围绕异常处理构建您的控制结构,而应尽可能避免在任何时间和任何地方发生异常。
请记住,当事情(无法修复)出错时尽早崩溃。将所有代码放在try-catch语句中是荒谬的,但是不要忘记报告和记录所有异常。
但不是很胆大妄为地认为在创建标签,设置表格位置时会有例外。在这样的简单操作中,有时会出现异常。
绝对没错!总有一种您不会预料到的出错的方法。在这种情况下,“鸡胸肉”是一个荒谬的表达。软件开发并不是要通过忽略潜在问题来证明自己的男子气概。
什么是一个有效的问题是它是否是有用的在您的编码标准说,他们必须将点捕获的异常。您的语句看起来就像您必须在每个方法主体周围都有try / catch块,这确实是荒谬的,因为您经常无法立即对异常执行某些有用的操作,而这实际上就是异常的全部要点:您可以选择让它们在适当的时候向上传播要处理的调用堆栈。
我会反过来。是的,因为一般情况下,异常处理是一件好事,但是实际上您可以在捕获异常时以明智的方式处理所有可能的异常吗?有时,特别是如果您不是在编写关键任务软件时,最好是在出现严重错误时以某种半路控制的方式简单地崩溃和刻录。
如果不能100%确定可以处理可能捕获的每个异常,则最好编写某种通用异常处理程序,将程序的主循环包装在其中-明确地知道该异常的确切机制取决于您使用的语言。在此处,尽可能记录有关异常的详细信息,保存程序状态(除了存储到用户当前正在使用的任何数据存储之外的其他位置 -记住,此时它可能已损坏) ), 等等。然后,重新抛出异常并让OS处理它认为合适的异常。在这个万能的异常处理程序中,为灾难性故障做好准备。然后,在重新启动程序时,请查看该状态是否有任何用处,并恢复可以恢复的状态。并可能会向用户发送错误报告给您。
总体而言,不推荐使用try / catch,因为从资源的角度来看,catch块是如此昂贵。尝试/捕获用法使我想起了风险管理。风险管理具有两个方面:
现在,如果您出门在外,那么一架钢琴落在您的头上的可能性很小(可能为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.
}
您应该在适当的时候使用try-catch,但是请哦,请不要捕获所有异常,甚至不要记录它。到那时,它是代码臭味和伪劣的工作。
我个人无法忍受例外,它们非常非常非常难以正确处理。试图破坏损坏的数据非常,非常,非常困难!
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 ;)
}
您不可能在每个出口处正确清理。例外是硬的!
异常的唯一好处是,如果您不捕获异常,则应用程序会因意外行为而崩溃。