CA2000:Microsoft.Reliability 对象未沿所有异常路径进行处理

Posted

技术标签:

【中文标题】CA2000:Microsoft.Reliability 对象未沿所有异常路径进行处理【英文标题】:CA2000 : Microsoft.Reliability object is not disposed along all exception paths 【发布时间】:2012-02-09 08:55:28 【问题描述】:

我在以下方法中遇到代码分析错误。

    public static OracleCommand CreateStoredProcedureCommand(string name,
                                                             OracleConnection connection)
    
        return new OracleCommand(name, connection)  CommandType = CommandType.StoredProcedure ;
    

CA2000:Microsoft.Reliability:方法中 'StoredProcedureHelper.CreateStoredProcedureCommand(字符串, OracleConnection)', 对象'command' 并没有被处理 异常路径。在对象“命令”上调用 System.IDisposable.Dispose 在所有对它的引用都超出范围之前

如何在不抑制的情况下解决这个问题?

【问题讨论】:

【参考方案1】:

当对属性的赋值引发异常时,对象未被释放。试试这个:

public static OracleCommand CreateStoredProcedureCommand(string name,
                                                         OracleConnection connection)

    OracleCommand result = new OracleCommand(name, connection);
    try
    
        result.CommandType = CommandType.StoredProcedure;
        return result;
    
    catch
    
        result.Dispose();
        throw;
    

【讨论】:

【参考方案2】:

从方法上看,处理对象的责任不能总是由调用者承担。

你必须压制它。

【讨论】:

正如 Henrik 所说,属性设置器有可能抛出异常而使对象未处理。

以上是关于CA2000:Microsoft.Reliability 对象未沿所有异常路径进行处理的主要内容,如果未能解决你的问题,请参考以下文章

使用链式构造函数避免代码分析 CA2000 警告?

为啥 FxCop 不报告 CA2000 对于这种未处置的类实例的琐碎情况?

“CA2000 在失去范围之前处理对象”,原因不明

代码分析警告 CA2000:在对象“new ContainerControlledLifetimeManager()”上调用 Dispose

CA2000:Microsoft.Reliability 对象未沿所有异常路径进行处理

为啥我在 IDisposable 类中获得带有私有成员 IDisposable 的 CA2000?