catch(Exception ex)
{
}
最好的方法是什么?
将它们全部撕掉并让它崩溃? 添加日志代码?留言箱? 这是在C#。
答案 0 :(得分:23)
这在一定程度上取决于你的攻击性。这个应用程序是内部还是外部?您的更改是否会很快部署在实时系统上?您是否有特定的错误需要修复,或者它只是被视为灾难?
为了尽可能快地减少错误数量,但是最大的损失风险,只需删除所有捕获块并让异常冒泡。对于更精细的方法,只需添加日志记录即可。
如果可能的话,您还应该与编写应用程序的人交谈。试着找出为什么他们有这么多异常吞咽障碍。他们真的了解异常吗?这里需要一定的机智,我怀疑:)
下一站:单元测试......
答案 1 :(得分:14)
修复您设置的错误,并将异常吞咽块报告为新的,严重的错误。
答案 2 :(得分:12)
第一个中间目标是全面了解哪些例外被忽略以及在哪里;为此,您可以简单地将日志记录代码添加到每个可怕的catch
- 所有块中,准确显示它是什么块,以及它捕获和隐藏的内容。对已经过检测的代码运行测试套件,您将获得修复工作的起始“蓝图”。
如果你没有拥有测试套件,那么,首先,让单个单元测试可以等待(使用遗留代码检查Feathers' great book - 遗留代码是这绝对是你的问题;-),但是你需要一套可以自动运行的集成测试,并解决你应该修复的所有错误。
当你去修复bug之后的bug(许多不会被引起过于宽泛的catch块,只是隐藏 /“被他们推迟”;-) ,一定要以“测试驱动”的方式工作:添加一个单元测试,检查错误,确认它中断,修复错误,重新运行单元测试以确认错误消失。您不断增长的单元测试套件(一切可能被模拟或伪造)将快速运行,您可以在工作时保持廉价重新运行,尽快捕捉可能的回归,当它们仍然易于修复时。
你所分配的任务实际上比“声望很高”的软件开发任务(如原型和新架构)更难(通常更重要),但往往被误解和低估(因此奖励不足! )由管理层/客户;确保与利益相关者保持一个非常清晰和开放的沟通渠道,指出你正在做的所有大量成功的工作,它是多么具有挑战性,并且(为了他们的缘故,比你自己更多),他们将拥有多少通过在第一时间做到这一点来保存(也许下次他们会...我知道,我天生就是一个狂热的乐观主义者;-)。也许他们甚至会为你分配一个合作伙伴,然后你就可以进行代码审查和结对编程,从而极大地提高了工作效率。
而且,最后但并非最不重要的,祝你好运!!! - 不幸的是,你需要它......幸运的是,正如杰斐逊所说,“我工作越努力,我就越运气似乎有“; - )
答案 3 :(得分:7)
按如下方式更改catch块:
catch (Exception ex)
{
Logger.Log(String.Format(
System.Globalization.CultureInfo.InvariantCulture,
"An exception is being eaten and not handled. "+
"This may be hiding critical errors.\n"+
"Exception: {0}",
ex));
}
答案 4 :(得分:3)
...哇
我会犹豫是否将它们撕掉,因为赔率只会造成更多的“错误”。第一步是添加日志记录,以便您知道发生了什么。在您有足够的信息后,您将能够进行重构....仔细
单元测试是测试任何重构的好方法。我还建议你准备好很多。
答案 5 :(得分:3)
您应该选择的解决方案在很大程度上取决于您所处的环境。
我已经编写并向大多数客户介绍的编码指南,明确说明没有评论的空捕获条款(正如您在问题中所示)可以在不进行任何讨论的情况下删除。我写这条规则的原因是因为我一直遇到这种语句,它们几乎总是隐藏很多错误。通常,try块中的代码越多,它们隐藏的错误就越多。多年来,我通过简单地删除空catch子句来发现(并解决了)很多错误。程序通常是相同的:
虽然这种方法在这些年里为我(和我的客户)提供了很好的服务,但是有一个'但是'。例如,我目前的一个客户是医疗机构,开发人员有兴趣使用我的编码指南。但是,我坚持要求他们从指南中删除该特定规则。虽然他们的软件中有很多空的catch语句(远远超过100),但那些讨厌的东西会隐藏很多错误,并且在我使用他们的软件时会一直记住我;你必须在这些类型的应用程序中非常小心。在这种情况下,我将首先添加日志语句,而不是删除它们。在此之后,当您知道发生了哪些类型的异常以及之前的开发人员为什么首先添加该catch语句时,您可以逐个缓慢地删除它们。
在所有情况下,您应该在应用程序的顶部有一个常规catch语句(或者在您的Web应用程序中有一个异常处理程序),它将记录任何冒泡的异常。
额外注意,我的指南还指出,您将配置Visual Studio以中断所有异常,方法是转到Debug / Exceptions ... / Common Language Runtime Exceptions并选中'Thrown'复选框。通过这种方式,您可以立即发现异常。
答案 6 :(得分:2)
警告:这是一般建议,你环境中的怪癖可能会使它变得不可能,例如:时间压力。
除了在系统的入口点(主要方法,服务端点,线程调用堆栈顶部,事件处理程序 - 用于UI代码)之外,将它们全部删除,并将日志记录/错误处理添加到异常处理程序仍然存在。
开始一个将处理程序添加回所需位置的过程,即应该在较低位置处理异常的位置,并进行适当的日志记录/错误报告。
让系统再次运行取决于是否进行了一系列良好的验收/回归测试,以便在完成所有更改后验证系统是否正确。
答案 7 :(得分:1)
显然,记录所有被抑制的异常是第一个开始的地方 - 当你需要确保你的代码在所有情况下(即你不在的情况下)正常降级时,毯式抑制会很有用希望被你未能预料到的异常类型所捕获,但是可以隐藏一个需要更多处理的意外问题而不是简单地被忽略,因此所有异常处理程序必须至少报告异常已被抑制,如果出现意外行为,你就会有明确的线索跟踪。
删除捕获是愚蠢的,因为在许多情况下需要“处理”某些异常以使程序正常工作(尽管您可能不同意如何处理它们,并且可能是与这种方法相关的风险,原作者有理由以这种方式编写代码.Ig他没有添加解释他的理由的评论,然后不要假设你比他更了解,尤其不是在“全球搜索并替换“方式”。
然而,似乎没有人指出最明显,最快的实现起点:转到“调试 - >异常”并启用“当异常抛出时中断” “公共语言运行时异常”部分。这将导致调试器针对抛出的每个异常(在调用程序的catch块来处理它之前)中断,因此您将能够在调试器下测试应用程序并确定哪些catch块在您尝试时抑制哪些异常重复一个给定的错误,然后你可以从中判断该特定的捕获块是否对所讨论的错误有任何影响。
答案 8 :(得分:0)
为了了解正在发生的事情,您可以采取的一种方法是获取每个空的Exception
块,并让每个块调用方法breakOnException(Exception e)
。
除了(比如)记录之外,此方法不必执行任何操作。然后,您可以在具有此方法断点的调试器下运行该程序,并监视要触发的断点,然后调查原因。不幸的是,这有点劳动密集型。
您是否有可以针对调试器中的代码运行的单元测试?用这些做上述事情是有意义的。