Обработка исключений, нужно ли ловить каждое конкретное исключение? - PullRequest
3 голосов
/ 09 марта 2012

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

try
{
    //Code goes here
}
catch
{
}

Или я должен сделать это следующим образом:

try
{
    //Code goes here
}
catch(Exception ex)
{
}

Или я должен сделать это так:

try
{
    //Code goes here
}
catch(KeyNotFoundException ex)
{
}

Причина, по которой я спрашиваю, заключается в том, что когда я смотрю на счетчик сбоев в App Hub, у меня возникает много сбоев, связанных с KeyNotFoundException, но яникогда не происходит сбоев в моем приложении.Может ли это быть причиной того, что я не улавливаю конкретное исключение, а статистика сбоя App Hub классифицирует его как сбой, даже если обработано исключение?

РЕДАКТИРОВАТЬ: Вот несколько скриншотов сбоя App Hubстатистика (Stack Trace).Кто-нибудь знает, что это подробно?Это связано с моим фоновым агентом, и это может быть причиной того, что у меня никогда не было сбоев в приложении:

enter image description here

enter image description here

enter image description here

Ответы [ 6 ]

3 голосов
/ 09 марта 2012

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

Пустой перехват или перехват Исключения являются наиболее общими перехватами (Каждое исключение происходит от базового класса Exception, поэтому вы перехватываете все.), Критический код находится там, где вы не используете try-catch. Основываясь на исключении, вы должны проверить свои словари и подумать, какие условия могут вызвать ошибку.

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

public User GetUser(string username)
{
    if (String.IsNullOrEmpty(username))
        throw ArgumentNullException("username");
    return this.users[username];
}

В этом случае, если что-то пойдет не так, вы увидите, что вы использовали нулевое значение для имени пользователя, в противном случае вы увидите KeyNotFoundException. Надеюсь, это поможет, удачи!

2 голосов
/ 09 марта 2012

Вы можете использовать базовое исключение, чтобы перехватить более производное исключение, поэтому Exception перехватит KeyNotFoundException, потому что последнее наследует первое. Строго говоря, если вы хотите поймать «любое» исключение, catch (Exception) будет достаточно.

Однако вы должны ловить исключения, только если вы можете обрабатывать их осмысленным образом. Хотя я не уверен, как складывается это мышление против разработки WP.

Что касается вашей основной проблемы, я понятия не имею. Разве App Hub не предоставляет никаких подробностей о сбое, таких как следы стека?

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

1 голос
/ 09 марта 2012

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

Для вашей конкретной проблемы опубликованная вами ссылка, похоже, указывает на проблему с чтением значений из изолированного хранилища (IsolatedStorage.get_Item) - поэтому, где бы вы ни обращались к IsolatedStorage во время вызова ScheduledTaskAgent, вы должны убедиться, что элемент существует до его получения.Возможно, отсутствуют некоторые параметры конфигурации или что-то в этом роде?

1 голос
/ 09 марта 2012

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

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

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

1 голос
/ 09 марта 2012

Если вас интересует конкретное исключение, такое как KeyNotFoundException в определенной части кода, то вы поймаете его следующим образом

try
{
    //Code goes here
}
catch(KeyNotFoundException ex)
{

}

Если вы хотите поймать определенное исключение и какое-то неопределенное, вы делаете что-то вроде этого

try
{
    //Code goes here
}
catch(KeyNotFoundException ex)
{

}
catch(Exception ex)
{

}

Если вы хотите убедиться, что ваше приложение не дает сбоя, используйте пример Коллина с событием Application.UnhandledException.

1 голос
/ 09 марта 2012

Нет, вам не нужно перехватывать каждый конкретный тип исключения в блоке try / catch, см. Справочник по языку C # .

Однако вместо того, чтобы заключать весь код в блоки try / catch, вы, вероятно, захотите добавить логику обработки исключений и войти в обработчик события Application.UnhandledException . См. этот отличный пост для примера того, как обрабатывать это событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...