Регистрация исключения перед его генерациейC#

Место общения программистов C#
Ответить
Anonymous
 Регистрация исключения перед его генерацией

Сообщение Anonymous »

В моем приложении есть Logger, который записывает сообщения о поведении приложения в файл журнала. Если вот-вот будет выброшено исключение, я хочу, чтобы оно также было зарегистрировано. Для этого я передаю исключение в Logger, который регистрирует его, а затем выдает.

Код: Выделить всё

public static class Logger
{
public static void Add(LogLevels level, string message)
{
//...
}

public static void Add(Exception exception)
{
Add(LogLevels.Fatal, exception.Message);
Add(LogLevels.Fatal, exception.StackTrace);
throw exception;
}
}
Передача исключения в Logger позволяет мне уменьшить объем кода при его создании (текущее решение):

Код: Выделить всё

public static ICad Instance
{
get
{
if (_instance == null)
{
Logger.Add(new NullReferenceException("CAD Connector instance requested before running creation procedure"));
}
return _instance;
}
}
Вместо (старое решение):

Код: Выделить всё

public static ICad Instance
{
get
{
if (_instance == null)
{
var ex = new NullReferenceException("CAD Connector instance requested before running creation procedure")
Logger.Add(LogLevels.Fatal, ex.Message);
Logger.Add(LogLevels.Fatal, ex.StackTrace);
throw ex;
}
return _instance;
}
}
Как видите, первое решение гораздо более лаконично.
Однако проблема в том, что компилятор не осознает, что исключение передано будет создан Logger.Add, поэтому в этом примере отображается предупреждение о возможном возврате нулевой ссылки при возврате _instance. Его можно подавить с помощью return _instance!;, но подобные проблемы продолжают возникать и в других местах, где я использую Logger.Add вместо того, чтобы напрямую генерировать исключение, иногда до такой степени, что оно выигрывает. невозможно даже компилировать (например, в операторах switch), что требует грязных хаков и подавления предупреждений.
Эти проблемы можно обойти, но мне кажется, что я делаю это Неправильный путь. Может ли кто-нибудь посоветовать, есть ли для этого чистое решение, которое не требует подавления предупреждений компилятора, но также позволит мне создавать исключения с минимальным кодом, как в моем текущем решении?

Подробнее здесь: https://stackoverflow.com/questions/793 ... hrowing-it
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»