Я хочу написать некоторую попытку и поймать, что поймать любой тип или исключение, достаточно ли этого кода (что способ сделать в Java)?
try {
code....
}
catch (Exception ex){}
Или это должно быть
try {
code....
}
catch {}
?
Я хочу написать некоторую попытку и поймать, что поймать любой тип или исключение, достаточно ли этого кода (что способ сделать в Java)?
try {
code....
}
catch (Exception ex){}
Или это должно быть
try {
code....
}
catch {}
?
Оба подхода поймают все исключения. Между двумя примерами кода нет существенной разницы, кроме того, что первая генерирует предупреждение компилятора, поскольку 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;
.
Все исключения производятся от Exception
, поэтому оба из них будут работать.
Я бы спросил, почему вы хотите это сделать. Вы должны ловить только исключения, которые можно восстановить. Все остальное должно заставить ваше приложение умереть ужасной огненной смертью. Лучше, чтобы ваше приложение потерпело крах, чем с продолжением возможного повреждения.
Обратите внимание, что помимо всех других комментариев существует небольшая разница, которую следует упомянуть здесь для полноты!
С предложением о пустое 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?
Оба варианта прекрасны, но только первый позволит вам проверить само Исключение.
Оба проглатывают исключение, и вы должны только перехватывать исключения, чтобы сделать что-то значимое. Скрытие проблемы не значимо!
Я улавливаю все исключения и сохраняю их в базе данных, поэтому ошибки могут быть легко исправлены - сохранена страница, место, дата и т.д.
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();
}
Оба способа правильны Если вам нужно что-то сделать с объектом Exception в блоке catch, то вы должны использовать
try {
code....
}
catch (Exception ex){}
и использовать ex в блоке catch.
Во всяком случае, не всегда хорошая практика для класса исключений, это скорее практика cathc для более конкретного исключения - исключение, которое вы можете ожидать.
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
попробовать {
.. .. ..
}
catch (Exception ex) {
.. .. ..
} Exception ex означает все исключения.