Подтвердить что ты не робот

Как поймать все исключения в С#, используя try и catch?

Я хочу написать некоторую попытку и поймать, что поймать любой тип или исключение, достаточно ли этого кода (что способ сделать в Java)?

try {
code....
}
catch (Exception ex){}

Или это должно быть

try {
code....
}
catch {}

?

4b9b3361

Ответ 1

Оба подхода поймают все исключения. Между двумя примерами кода нет существенной разницы, кроме того, что первая генерирует предупреждение компилятора, поскольку ex объявляется, но не используется.

Но обратите внимание, что некоторые исключения являются специальными и будут автоматически обновлены.

ThreadAbortException - особое исключение, которое можно поймать, но оно будет автоматически снова поднято в конце блока catch.

http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx


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

  • Поймать и игнорировать конкретное исключение, которое, как вы знаете, не является фатальным.

    catch (SomeSpecificException)
    {
        // Ignore this exception.
    }
    
  • Ловить и записывать все исключения.

    catch (Exception e)
    {
        // Something unexpected went wrong.
        Log(e);
        // Maybe it is also necessary to terminate / restart the application.
    }
    
  • Поймать все исключения, выполнить некоторую очистку, а затем сбросить исключение.

    catch
    {
        SomeCleanUp();
        throw;
    }
    

Обратите внимание, что в последнем случае исключение возвращается с помощью throw;, а не throw ex;.

Ответ 2

Все исключения производятся от Exception, поэтому оба из них будут работать.

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

Ответ 3

Обратите внимание, что помимо всех других комментариев существует небольшая разница, которую следует упомянуть здесь для полноты!

С предложением о пустое catch вы можете поймать исключения, отличные от CLSCompliant, если сборка отмечена как "RuntimeCompatibility (WrapNonExceptionThrows = false)" (по умолчанию это значение истинно с CLR2). [1] [2] [3]

[1] http://msdn.microsoft.com/en-us/library/bb264489.aspx

[2] http://blogs.msdn.com/b/pedram/archive/2007/01/07/non-cls-exceptions.aspx

[3] Будет ли CLR обрабатывать как жалобы CLS-Жалобы, так и не относящиеся к CLS?

Ответ 4

Оба варианта прекрасны, но только первый позволит вам проверить само Исключение.

Оба проглатывают исключение, и вы должны только перехватывать исключения, чтобы сделать что-то значимое. Скрытие проблемы не значимо!

Ответ 5

Я улавливаю все исключения и сохраняю их в базе данных, поэтому ошибки могут быть легко исправлены - сохранена страница, место, дата и т.д.

try
{     
   Cart = DB.BuyOnlineCartMasters.Where(c => c.CmpyID == LoginID && c.Active == true).FirstOrDefault();
}
catch (Exception e)
{
    ErrorReport.StoreError("CartMinifiedPartial-Company", e);  
    -- storing the error for reference
}

Сохранение

public static void StoreError(string ErrorPage, Exception e)
    {
        try
        {
            eDurar.Models.db_edurarEntities1 DB = new Models.db_edurarEntities1();
            eDurar.Models.ErrorTable Err = new eDurar.Models.ErrorTable();
            Err.ErrorPage = ErrorPage;
            if (e.Message != null)
            {
                Err.ErrorDetails = e.Message;
            }
            if (e.InnerException != null)
            {
                Err.InnerException = e.InnerException.Message.ToString();
            }

            Err.Date = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("India Standard Time"));
            DB.ErrorTables.AddObject(Err);
            DB.SaveChanges();
}

Ответ 6

Оба способа правильны Если вам нужно что-то сделать с объектом Exception в блоке catch, то вы должны использовать

try {
code....
}
catch (Exception ex){}

и использовать ex в блоке catch.

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

Ответ 7

    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        throw new NotImplementedException();
    }

Ответ 8

попробовать {

.. .. ..

}

catch (Exception ex) {

.. .. ..

} Exception ex означает все исключения.