丢弃异常变量时有技术上的区别吗?

时间:2018-12-07 13:57:39

标签: c# exception-handling

在我职业生涯的某个时候,我了解到做与做之间有很大的区别

throw e

throw;

(第一个版本使堆栈跟踪不完整)。

之间有明显的区别吗?
catch(FormatException)

catch(FormatException e)

也有什么显着差异? (除无选项外,调试时悬停一个异常)

我想知道是否有一些技术上的原因,因为昨天我在某个github repo(dnSpy)中注意到开发人员丢弃了该变量。我希望对此的答案比“不,它更令人振奋”,如果您对异常不感兴趣的话,它的书写时间会短一些。

Sample image

3 个答案:

答案 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);
}

请注意,以上内容将记录并吞下异常,这完全取决于您代码的用例。