在我职业生涯的某个时候,我了解到做与做之间有很大的区别
throw e
和
throw;
(第一个版本使堆栈跟踪不完整)。
之间有明显的区别吗?
catch(FormatException)
和
catch(FormatException e)
也有什么显着差异? (除无选项外,调试时悬停一个异常)
我想知道是否有一些技术上的原因,因为昨天我在某个github repo(dnSpy)中注意到开发人员丢弃了该变量。我希望对此的答案比“不,它更令人振奋”,如果您对异常不感兴趣的话,它的书写时间会短一些。
答案 0 :(得分:3)
好吧,CLR不必创建变量。就是这样。该异常已被实例化,因此无法获得异常。只是分配一个额外的变量。
我认为开发人员驱使删除该变量的原因是编译器警告:
CS0168:声明了变量'e',但从未使用
答案 1 :(得分:2)
在发布模式下,编译器生成的IL没有区别(在任何情况下都没有为异常分配局部变量)。
在Debug模式下进行编译(至少对我来说,在VS 2017中进行编译)略有不同,其中在catch (SomeException e)
情况下分配局部变量,而在catch (SomeException)
情况下分配局部变量
因此,删除未使用变量的唯一令人信服的原因是消除了编译器警告(对我来说这是一个足够好的原因)。
答案 2 :(得分:0)
与众不同之处在于,它可以让您访问Exception
对象作为变量,这样您就可以做不同的事情,例如常见的方法是记录日志。
所以您可以做类似的事情
catch (FormatException e)
{
_log.LogError(e);
}
请注意,以上内容将记录并吞下异常,这完全取决于您代码的用例。