C# 为什么ReSharper建议删除自己的修复程序?

C# 为什么ReSharper建议删除自己的修复程序?,c#,resharper,sqlexception,catch-block,rethrow,C#,Resharper,Sqlexception,Catch Block,Rethrow,ReSharper建议重新引用一个异常,然后,当我这样做时,它说整个catch子句无论如何都是多余的,并建议将其删除 我正在使用此代码(来自MethodMan): 当我在解决方案中遇到ReSharper Inspect>代码问题时,它会怀疑这里是否有“异常重试”的意图: 如果我接受ReSharper建议的修复(“rethrow异常”),ReSharper将删除“ex”: ……但是,在下一次检查中,它说,“捕获条款是多余的”,并建议将其全部删除 但是,当然,如果我删除catch块,它将不会编译(“

ReSharper建议重新引用一个异常,然后,当我这样做时,它说整个catch子句无论如何都是多余的,并建议将其删除

我正在使用此代码(来自MethodMan):

当我在解决方案中遇到ReSharper Inspect>代码问题时,它会怀疑这里是否有“异常重试”的意图:

如果我接受ReSharper建议的修复(“rethrow异常”),ReSharper将删除“ex”:

……但是,在下一次检查中,它说,“捕获条款是多余的”,并建议将其全部删除

但是,当然,如果我删除catch块,它将不会编译(“预期的catch或finally”)。我可以试着把它移除…但是。。。如果我将其更改为:

                catch (SqlException sqlex)
                {
                    for (int i = 0; i < sqlex.Errors.Count; i++)
                    {
                        var sqlexDetail = String.Format("From
ExecuteDataSet(), SQL Exception #{0}{1}Source: {2}{1}   
Number: {3}{1}State: {4}{1}Class: {5}{1}Server: {6}{1}Message: {7}
{1}Procedure: {8}{1}LineNumber: {9}",
                            i + 1, // Users would get the fantods if they
saw #0
                            Environment.NewLine,
                            sqlex.Errors[i].Source,
                            sqlex.Errors[i].Number,
                            sqlex.Errors[i].State,
                            sqlex.Errors[i].Class,
                            sqlex.Errors[i].Server,
                            sqlex.Errors[i].Message,
                            sqlex.Errors[i].Procedure,
                            sqlex.Errors[i].LineNumber);
                        MessageBox.Show(sqlexDetail);
                    }
                }
                catch (Exception ex)
                {
                    String exDetail
String.Format(UsageRptConstsAndUtils.ExceptionFormatString, ex.Message, 

Environment.NewLine, ex.Source, ex.StackTrace);
                    MessageBox.Show(exDetail);
                }
catch(SqlException-sqlex)
{
对于(int i=0;i

…ReSharper的检查并没有对此进行抱怨。

执行此操作时,您正在重置调用堆栈,这将丢失有关首先引发异常的原因的重要信息

catch (SqlException ex)
{
    throw ex;
}
如果ReSharper更聪明,它会告诉您首先删除该部分,从而节省您重写该部分代码所需的时间

下面的代码更好,因为它不会丢失堆栈跟踪信息,但这是不必要的

catch (SqlException ex)
{
    throw;
}
即使您忽略了上面的内容,异常也会“冒泡”,并且可以在程序堆栈的某个更高位置被捕获,无论您准备在哪里实际处理它(记录它、显示消息或采取其他操作等)

这是一种糟糕的编程实践。您将丢失引发异常的原始堆栈跟踪

catch (SqlException ex)
{
   throw;
}

除了浪费时间重新抛出相同的异常之外,对您完全没有任何帮助。Re sharper希望您使用变量ex做一些事情,比如log it。

原始的
throw
throw ex
都是毫无意义的。最后一个例子(在
catch
块中有代码)显然是在
ex
上做了一些事情,所以我想Resharper意识到了这一点,并没有抱怨
(或者我喜欢称之为release)是毫无意义的,而且
抛出ex(我称之为rethrow)实际上是错误的,因为它重置了堆栈跟踪。因此,基本上Resharper首先让您修复
throw-ex的坏习惯然后修复一个
抛出的无意义
@B.ClayShannon您是否将此代码放在单独的静态类中。。?不管抛出参数是什么,您实际上可以用
控制台.WriteLine(ex.Message)
替换它,或者您可以记录实际的ex.Message。我在前面的示例中向您展示的是一种实现方法。有时,你必须跳出框框思考如何使用示例,不必逐字逐句地使用示例,你可以改变我给你的原始方法,使其适用于你的用例。…@B.ClayShannon请小心编辑人们的答案,你应该只编辑你自己关于格式和/或的问题修正打字错误等,除非你正在编辑的内容确实解决了与你的问题相关的问题。。如果是的话,那么将其作为评论张贴在该海报的答案下。。这样你就不会混淆问题。
catch (SqlException ex)
{
    throw ex;
}
catch (SqlException ex)
{
    throw;
}
catch (SqlException ex)
{
    throw ex;
}
catch (SqlException ex)
{
   throw;
}