为什么 ReSharper 建议删除它自己的修复程序?
Why does ReSharper recommend the removal of its own fix?
ReSharper 建议重新抛出异常,然后,当我这样做时,它说整个 catch 子句无论如何都是多余的,并建议将其删除。
我正在使用这段代码(来自 MethodMan ):
public static DataTable ExecuteDataSet(string sql, CommandType cmdType, params SqlParameter[] parameters)
{
using (DataSet ds = new DataSet())
using (SqlConnection connStr = new SqlConnection(UsageRptConstsAndUtils.CPSConnStr))
using (SqlCommand cmd = new SqlCommand(sql, connStr))
{
cmd.CommandType = cmdType;
foreach (var item in parameters)
{
cmd.Parameters.Add(item);
}
try
{
cmd.Connection.Open();
new SqlDataAdapter(cmd).Fill(ds);
}
catch (SqlException ex)
{
throw;
}
return ds.Tables[0];
}
}
当我有 ReSharper Inspect > Code Issues in Solution 时,它想知道是否 "exception rethrow possibly intended" 这里:
catch (SqlException ex)
{
throw ex;
}
如果我接受 ReSharper 建议的修复 ("rethrow exception"),Resharper 会删除 "ex":
catch (SqlException ex)
{
throw;
}
...但是,在下一次检查中,它说,"catch clause is redundant" 并建议将其完全删除。
但是,当然,如果我删除 catch 块,它就不会编译 ("Expected catch or finally")。我可以删除 try...但是...如果我将其更改为:
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);
}
...ReSharper 的检查没有抱怨。
执行此操作时,您正在重置调用堆栈,这会丢失有关首先引发异常的原因的宝贵信息。
catch (SqlException ex)
{
throw ex;
}
如果 ReSharper 更聪明,它会告诉您首先删除该部分,从而节省您重写该部分代码的时间。
以下代码更好,因为它不会丢失堆栈跟踪信息,但没有必要。
catch (SqlException ex)
{
throw;
}
即使您省略了上面的内容,异常也会 "bubble up" 并且可以在程序堆栈的某个地方被捕获,无论您准备好实际处理它(记录它,或显示消息,或采取一些替代措施等)。
catch (SqlException ex)
{
throw ex;
}
是一种糟糕的编程习惯。您从抛出的异常中丢失了原始堆栈跟踪。
catch (SqlException ex)
{
throw;
}
除了浪费时间重新抛出相同的异常之外,对您毫无用处。 Re-sharper 希望您对变量 ex 做一些事情,比如记录它。
ReSharper 建议重新抛出异常,然后,当我这样做时,它说整个 catch 子句无论如何都是多余的,并建议将其删除。
我正在使用这段代码(来自 MethodMan
public static DataTable ExecuteDataSet(string sql, CommandType cmdType, params SqlParameter[] parameters)
{
using (DataSet ds = new DataSet())
using (SqlConnection connStr = new SqlConnection(UsageRptConstsAndUtils.CPSConnStr))
using (SqlCommand cmd = new SqlCommand(sql, connStr))
{
cmd.CommandType = cmdType;
foreach (var item in parameters)
{
cmd.Parameters.Add(item);
}
try
{
cmd.Connection.Open();
new SqlDataAdapter(cmd).Fill(ds);
}
catch (SqlException ex)
{
throw;
}
return ds.Tables[0];
}
}
当我有 ReSharper Inspect > Code Issues in Solution 时,它想知道是否 "exception rethrow possibly intended" 这里:
catch (SqlException ex)
{
throw ex;
}
如果我接受 ReSharper 建议的修复 ("rethrow exception"),Resharper 会删除 "ex":
catch (SqlException ex)
{
throw;
}
...但是,在下一次检查中,它说,"catch clause is redundant" 并建议将其完全删除。
但是,当然,如果我删除 catch 块,它就不会编译 ("Expected catch or finally")。我可以删除 try...但是...如果我将其更改为:
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);
}
...ReSharper 的检查没有抱怨。
执行此操作时,您正在重置调用堆栈,这会丢失有关首先引发异常的原因的宝贵信息。
catch (SqlException ex)
{
throw ex;
}
如果 ReSharper 更聪明,它会告诉您首先删除该部分,从而节省您重写该部分代码的时间。
以下代码更好,因为它不会丢失堆栈跟踪信息,但没有必要。
catch (SqlException ex)
{
throw;
}
即使您省略了上面的内容,异常也会 "bubble up" 并且可以在程序堆栈的某个地方被捕获,无论您准备好实际处理它(记录它,或显示消息,或采取一些替代措施等)。
catch (SqlException ex)
{
throw ex;
}
是一种糟糕的编程习惯。您从抛出的异常中丢失了原始堆栈跟踪。
catch (SqlException ex)
{
throw;
}
除了浪费时间重新抛出相同的异常之外,对您毫无用处。 Re-sharper 希望您对变量 ex 做一些事情,比如记录它。