异常分析和防止异常

时间:2015-11-12 20:02:19

标签: c# exception design-patterns nullreferenceexception code-analysis

我们被要求查看涉及约150万行代码的客户端应用程序代码。该应用程序具有很大的稳定性并经常发生崩溃,我们的任务是通过手动静态代码审查来查找此类问题的根本原因。目标是防止例外。我们的目标不是一旦发生就更好地处理它们。

我有两个例子来说明防御性编程以防止异常:在非强制逻辑和强制逻辑的情况下。

第一个例子(非强制性逻辑): 防御性编码(块2中的“if”条件)在“obj”的使用之前。如果“obj”为null,则“if”条件会跳过否则会导致异常的逻辑。我们可能在代码中有“if”条件不存在的实例 - 并且应该添加它以防止异常。 我们想知道我们应该添加这种防御逻辑的程度(努力)。

第二个例子(强制逻辑): 在第二个示例中,“if”条件检查null(块3),跳过逻辑是无效的,因为逻辑是强制性的。在这种情况下,“if”条件必须抛出异常。 这种防御性逻辑不会提高稳定性:无论是由于空引用异常还是由于“if”条件引发异常,都会引发异常。

我们被要求在代码中找到导致抛出异常的模式,即为什么对象没有被设置 - 问题出在块1的逻辑中。(在这个例子中:因为只有当SomeCondition是不是假的)。

bool someCondition = false;
DataSet obj = null;



/*** Begin block 1 ***/

if(someCondition)
{
    obj = new DataSet();

    //Fill the obj with data
    Populate(obj);
}

/*** End block 1 ***/



/*** Begin block 2 ***/

//Perform some non-mandatory logic
//defensive coding
if(obj != null && obj.Tables["Employee"] != null && obj.Tables["Employee"].Rows[5] != null)
{
    DataRow row1 = obj.Tables["Employee"].Rows[5];
    row1["FirstName"] = "Bob";
}

/*** End block 2 ***/


/*** Begin block 3 ***/

//Perform  mandatory logic
//defensive coding
if (obj == null && obj.Tables["Employee"] == null && obj.Tables["Employee"].Rows[5] == null)
    throw new Exception("Object obj cannot be null");
 DataRow row2 = obj.Tables["Employee"].Rows[5];
 row2["Role"] = "Manager";

/*** End block 3 ***/

我们正在对代码进行人工审核,但它是一个巨大的ASP.NET MVC应用程序,它与后端WCF服务进行对话,我们正在努力寻找模式。是否可以手动执行其他操作?是否有任何工具可以帮助我们找到这样的模式。

2 个答案:

答案 0 :(得分:0)

错误 - >错误 - >失败

我将重点介绍Hanmer,Robert(2013-07-12),容错软件模式(Wiley Software Patterns Series)(第3-4页)中的定义。威利。 Kindle版。

  

条款错误错误失败具有非常具体的含义。

     
    

当交付的服务不再符合规范时,会发生系统失败,后者是对系统预期功能和/或服务的约定描述。 错误是系统状态中可能导致后续失败的部分;影响服务的错误表示发生故障或已发生故障。判断错误的原因是错误。 [Lap91,p。 4]

  

你的使命,因为你选择接受它:

  

目标是防止例外。我们的目标不是一旦发生就更好地处理它们。

所以我们正在谈论故障预防,其中故障错误的来源或原因(这是例外)。

在您的示例中,如果我追溯到问题的来源,则在块1中的someCondition中,某个时刻某个点的值为false,导致{{1没有被初始化。可能还有另一个错误导致这种情况出错。它就像一条链子。

如果您想防止异常,那么为什么不修复这些错误来源呢?防御性代码(在Hanmer的书中也有解释)很好,因为事情发生了,它有助于检测故障。但是你提供的例子似乎无效,因为你只是避免错误(而不是删除错误)。

此外,尽管第2块方法可以防止立即异常,但是假设您将代码设置为“非强制性”最好是正确的。否则,在代码中的某个其他位置,该逻辑块完成的工作(您跳过目标只是为了防止异常)可能会在系统中创建另一个错误

  

是否可以手动执行其他操作?是否有任何工具可以帮助我们找到这样的模式。

answer开始,有一个ReSharper的建议(但我从未使用过它)。但是,您可以尝试找到ASP.NET的一些等效的 lint

我意识到你的项目是在C#中,但SEI CERT Oracle Coding Standard for Java有很多可以应用的建议(从概念上讲)。如果应用程序使用线程,则有几个规则可能在C#中有用。

稳定性问题,IMO,不能那么容易“加工”。

答案 1 :(得分:0)

如果您使用的是最新版本的Visual Studio,您可以编写自己的分析程序或使用Code Cracker等开源分析程序来识别(并经常更正)异常处理(以及其他编码方面)中的模式。

https://code-cracker.github.io/diagnostics.html

例如,Code Cracker有几个分析器,我用于类似的代码评估目的,检测空的catch块,另一个常见的异常处理反模式。还要注意如何记录异常以及是否使用描述性错误消息(此链接还包含异常管理最佳实践和参考的列表):http://deviq.com/descriptive-error-messages/

相关问题