在没有 "unreachable code detected" 的情况下抛出临时异常

Throwing temporary exceptions without "unreachable code detected"

在编写代码时,我经常会临时注入随机异常以确保错误流符合预期。

例如

public void SomeFunc()
{
   Console.WriteLine("Some code");

   throw new Exception("BOOOOM!"); //added temporarily

   Console.WriteLine("Some more code");
}

问题是我将警告设置为错误,因此编译将失败并显示 CS0162 Unreachable code detected,因为 "Some more code" 永远不会 运行.

所以只要加上你说的条件:

public void SomeFunc()
{
   Console.WriteLine("Some code");

   if (true)
       throw new Exception("BOOOOM!"); //added temporarily

   Console.WriteLine("Some more code");
}

但是不,这个编译器足够聪明,可以注意到条件永远为真,并再次标记 CS0162。

我通常会得到以下结果:

public void SomeFunc()
{
   Console.WriteLine("Some code");

   var debug = true;
   if (debug)
       throw new Exception("BOOOOM!"); //added temporarily

   Console.WriteLine("Some more code");
}

所以我的闲置问题是,因为我很懒,是否有更简单的方法来欺骗编译器?一个班轮将是完美的。

(是的,我最终会编写单元测试;)

这是两班。 Resharper 建议并为我做了这个。否则记住它几乎是不可能的。

    throw new Exception("Boo!");

#pragma warning disable 162

    // The unreachable code is here            

#pragma warning restore 162

虽然这是一个直接的答案,但我可能不会那样做,因为它很笨重。

您还可以更改错误的严重性,以便在编译时显示警告。这是我的默认设置。

具体操作方法因 Visual Studio 版本而异。 Here's the documentation.

在 Visual Studio 2019 年,您将在 .editorconfig 文件中添加或修改它:

[*.cs]

# CS0162: Unreachable code detected
dotnet_diagnostic.CS0162.severity = warning

事实上,编译器相当愚蠢。一般不识别非constant expressions。这意味着您只需要创建一个始终为真的条件,至少有一个非常量表达式。

我相信在阅读完 link 后,您可以想出 loads 个。这是一个例子:

if ("a".Length == 1) throw new Exception("...");