这个问题来自于针对我创建的对象运行的代码分析。分析表明,我应该捕获一种更具体的异常类型,而不仅仅是基本异常。
您是否发现自己只是使用捕获泛型异常,还是试图捕获特定的异常,并使用多个catch块默认为泛型异常?
所讨论的代码块之一如下:
internal static bool ClearFlags(string connectionString, Guid ID)
{
bool returnValue = false;
SqlConnection dbEngine = new SqlConnection(connectionString);
SqlCommand dbCmd = new SqlCommand("ClearFlags", dbEngine);
SqlDataAdapter dataAdapter = new SqlDataAdapter(dbCmd);
dbCmd.CommandType = CommandType.StoredProcedure;
try
{
dbCmd.Parameters.AddWithValue("@ID", ID.ToString());
dbEngine.Open();
dbCmd.ExecuteNonQuery();
dbEngine.Close();
returnValue = true;
}
catch (Exception ex)
{ ErrorHandler(ex); }
return returnValue;
}谢谢你的建议
编辑:这里是来自代码分析的警告
警告351 CA1031 : Microsoft.Design :修改'ClearFlags(string,Guid)‘以捕获比' exception’更具体的异常,或者重新抛出异常。
发布于 2009-09-11 14:43:16
你几乎永远不应该抓住顶级的例外。
在大多数情况下,您应该捕获和处理可能的最具体的异常,并且只有在有有用的东西可以使用它时才能这样做。
这个异常(haha)是,如果您捕获日志记录并重新抛出异常,则有时捕获顶级异常、记录异常并重新抛出它是可以的。
你几乎不应该抓住一个顶级的例外并吞下它。这是因为如果您捕捉到顶级异常,您并不真正知道您正在处理什么;绝对地,任何事情都可能导致异常,因此几乎可以肯定,您无法做任何能够正确处理每一个故障情况的操作。可能有一些失败,您可能只是想默默地处理和吞咽,但是仅仅是吞咽顶级的异常,您也会吞下一整堆本来应该向上抛出的代码来处理更高级别的异常。在您的代码示例中,您可能要做的是处理SQLException和log+swallow;然后对于异常,记录并重新抛出它。这个盖住了你自己。您仍然在记录所有的异常类型,但是您唯一吞没的是相当可预测的SQLException,这表明您的SQL/数据库存在问题。
一种常见的做法是,只有在这一点上实际可以解决的每一个句柄异常,如果您不能在代码中解决它,那么就允许它向上冒泡。如果您不能在下一个级别上解决它,允许它继续上升。如果它未被处理到顶部,则向用户显示一个礼貌的应用程序(可能尝试快速自动保存)并关闭应用程序。允许应用程序在未处理的异常之后继续运行通常被认为更糟,因为您无法预测应用程序的状态,因为有异常发生。最好只是关闭和重新启动应用程序,以恢复到预期的状态。
发布于 2009-09-11 14:56:53
看一看Krzysztof Cwalina的这篇文章,我发现这篇文章对于理解何时捕获或忽略异常非常有帮助:
如何设计异常层次结构
它描述的关于设计异常层次结构的所有原则在决定何时捕获、抛出或忽略异常时也是适用的。他将例外情况分为三组:
DivideByZeroException,它指示代码中的错误;您不应该处理这些错误,因为可以通过更改代码来避免这些错误。FileNotFoundException,您需要处理这些错误,因为您不能保证它们不会发生。(即使您检查文件是否存在,在读取文件之前,仍然可以在这一秒内删除它。)OutOfMemoryException ),您无法避免或处理。发布于 2009-09-11 14:45:30
您应该阅读一般的论文或google的“结构化异常处理”,更好地了解这个主题的全部内容,但是一般来说,捕捉每个异常都被认为是错误的做法,因为您不知道异常是什么(内存错误、内存不足、磁盘故障等等)。
对于许多未知/意外的异常,您不应该允许应用程序继续。一般来说,您“捕捉”和处理的只有那些异常玩具已经确定,作为分析的方法,您正在编码的catch子句,该方法实际上可以创建,你可以做一些事情。唯一应该捕获所有异常的时间(捕捉异常x)是执行类似于记录它的操作,在这种情况下,您应该立即重新抛出相同的异常(不管它是什么),这样它就可以将堆栈冒泡到某个一般的“未处理异常处理程序”,它可以向用户显示一条适当的消息,然后导致应用程序终止。
https://stackoverflow.com/questions/1411289
复制相似问题