Создание временных исключений без «кода, недоступного для обнаружения» - PullRequest
0 голосов
/ 14 апреля 2020

При написании кода я довольно часто временно вставляю случайные исключения, чтобы гарантировать, что поток ошибок соответствует ожидаемому.

например

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

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

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

Проблема в том, что у меня есть предупреждения, установленные как ошибки, поэтому компиляция не удастся с CS0162 Обнаружен недоступный код , так как "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");
}

Так что я простаиваю вопрос, так как я ленивый, есть ли более простой способ обмануть компилятор? Один лайнер был бы идеальным.

(И да, я в конце концов пишу юнит-тесты;)

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Компилятор на самом деле довольно тупой. Обычно он не распознает не константные выражения . Это означает, что вам просто нужно создать условие, которое всегда будет истинным, по крайней мере с одним непостоянным выражением.

Я уверен, что после прочтения ссылки вы можете получить load из них. Вот пример:

if ("a".Length == 1) throw new Exception("...");
1 голос
/ 14 апреля 2020

Вот два лайнера. Решарпер предложил и сделал это для меня. В противном случае запоминание было бы практически невозможным.

    throw new Exception("Boo!");

#pragma warning disable 162

    // The unreachable code is here            

#pragma warning restore 162

Хотя это прямой ответ, я бы, вероятно, не сделал этого, потому что это неуклюже.

Вы также можете изменить серьезность ошибки. так что компилируется с предупреждением. Это мои настройки по умолчанию.

Особенности того, как это сделать, зависят от версии Visual Studio. Вот документация .

В Visual Studio 2019 вы можете добавить или изменить это в своем файле .editorconfig:

[*.cs]

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