Looking for c# Keywords? Try Ask4Keywords

C# Language Лучшие практики


пример

Cheatsheet

ДЕЛАТЬ НЕ
Управляющий поток с контрольными инструкциями Управляющий поток с исключениями
Следить за проигнорированным (поглощенным) исключением путем ведения журнала Игнорировать исключение
Повторить исключение, используя throw Исключение повторного броска - throw new ArgumentNullException() или throw ex
Выбросить предопределенные системные исключения Выбросить пользовательские исключения, аналогичные предопределенным системным исключениям
Выбросить пользовательское / предопределенное исключение, если оно имеет решающее значение для логики приложения Выбросить пользовательские / предопределенные исключения, чтобы указать предупреждение в потоке
Ловить исключения, которые вы хотите обработать Поймать каждое исключение

НЕ управляйте бизнес-логикой с исключениями.

Контроль потока НЕ ​​должен выполняться исключениями. Вместо этого используйте условные утверждения. Если элемент управления можно сделать с инструкцией if-else , не используйте исключения, поскольку он снижает читаемость и производительность.

Рассмотрите следующий фрагмент г-ном Бад-Практиками:

// This is a snippet example for DO NOT
object myObject;
void DoingSomethingWithMyObject()
{
    Console.WriteLine(myObject.ToString());
}

Когда выполнение достигает Console.WriteLine(myObject.ToString()); приложение выкинет исключение NullReferenceException. Г-н Bad Practices понял, что myObject имеет значение null и отредактировал его фрагмент, чтобы поймать и обработать NullReferenceException :

// This is a snippet example for DO NOT
object myObject;
void DoingSomethingWithMyObject()
{
    try
    {
        Console.WriteLine(myObject.ToString());
    }
    catch(NullReferenceException ex)
    {
        // Hmmm, if I create a new instance of object and assign it to myObject:
        myObject = new object();
        // Nice, now I can continue to work with myObject
        DoSomethingElseWithMyObject();
    }
}

Поскольку предыдущий фрагмент кода охватывает только логику исключения, что мне делать, если myObject на данный момент не равен нулю? Где я должен освещать эту часть логики? Сразу после Console.WriteLine(myObject.ToString()); ? Как насчет после try...catch block?

Как насчет г-на лучших практик? Как он справится с этим?

// This is a snippet example for DO
object myObject;
void DoingSomethingWithMyObject()
{
    if(myObject == null)
        myObject = new object();
    
    // When execution reaches this point, we are sure that myObject is not null
    DoSomethingElseWithMyObject();
}

Г-н Лучшие практики достигли той же логики с меньшим количеством кода и понятной и понятной логикой.

НЕ перебрасывать исключения

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

НЕ поглощайте исключения без регистрации

try
{
    //Some code that might throw an exception
}
catch(Exception ex)
{
    //empty catch block, bad practice
}

Никогда не проглатывайте исключения. Игнорирование исключений сэкономит этот момент, но позже создаст хаос для ремонтопригодности. При регистрации исключений вы всегда должны регистрировать экземпляр исключения, чтобы отслеживать полную трассировку стека, а не только сообщение об исключении.

try
{
    //Some code that might throw an exception
}
catch(NullException ex)
{
    LogManager.Log(ex.ToString());
}

Не перехватывайте исключения, которые вы не можете обработать

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

try
{
    //Try to save the data to the main database.
}
catch(SqlException ex)
{
    //Try to save the data to the alternative database.
}
//If anything other than a SqlException is thrown, there is nothing we can do here. Let the exception bubble up to a level where it can be handled.