Главная » Silverlight » Необработанные исключения

0

Теоретически в кодах обработки исключений должны быть предусмотрены все си­туации, в которых возможны ошибки (например, чтение несуществующего файла, пре­рванная загрузка содержимого, обращение к недоступному серверу), однако иногда все же появляются неожиданные источники ошибок. Если в приложении происходит не­обработанная ошибка, оно завершается, а область содержимого Silverlight становится пустой. Если в приложение добавлен код JavaScript, реагирующий на потенциальные ошибки надстройки Silverlight, выполнение приложения будет продолжено. В против­ном случае пользователь не получит сообщение об ошибке.

Событие Application.UnhandledException предоставляет последний шанс отреа­гировать на исключение прежде, чем оно достигнет надстройки Silverlight и приведет к закрытию приложения. Код обработки этого события существенно отличается от кода JavaScript, добавляемого на страницу, потому что он имеет возможность отметить ис­ключение как обработанное. Использование этого метода позволяет эффективно нейтра­лизовать исключение, предотвратив его подъем в надстройку и завершение приложения.

Приведенный ниже код проверяет тип исключения и решает, позволить ли приложе­нию продолжить выполнение.

public void Application_UnhandledException (object sender, ApplicationUnhandledExceptionEventArgs e)

{

if (e.ExceptionObject is FileNotFoundException) {

// Подавление исключения и разрешение

// приложению продолжить выполнение

е.Handled = true;

}

1

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

После нейтрализации ошибки иногда имеет смысл сообщить о ней пользовате­лю. Одно из решений состоит в вызове пользовательского метода корневого элемента. Например, приведенный ниже код вызывает пользовательский метод ReprotError () класса Pagel, являющегося корневым элементом приложения.

MainPage rootPage = (MainPage)this.Rootvisual;

rootPage.ReportError(e.ExceptionObject);

Метод MainPage .Report О может проанализировать объект исключения и вывести соответствующее сообщение в элементе страницы.

Чтобы генерируемое приложение было более гибким, программа Visual Studio добав­ляет код обработки ошибок в каждое новое приложение Silverlight. Этот код проверяет, подключен ли в данный момент отладчик. Если да, значит, приложение выполняется в среде отладки Visual Studio. Если нет, код обрабатывает ошибку и применяет средства HTML (см. главу 14) для генерации ошибки JavaScript, вместо ошибки Silverlight. Ниже приведена сокращенная версия такого кода.

public void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)

{

if (!System.Diagnostics.Debugger.IsAttached) {

e.Handled = true;

try

{

string errorMsg = e.ExceptionObject.Message +

 e. ExceptionObject.StackTrace;

errorMsg = errorMsg.Replace (` " `, ‘\ “’) .

Replace("\r\n", @"\n");

System.Windows.Browser.HtmlPage.Window.Eval( "throw new Error (V’Unhandled Error in Silverlight Application " + errorMsg + "\");");

}

catch {}

}

}

Приведенный выше код преобразует катастрофическую ошибку Silverlight в относи­тельно безвредную ошибку JavaScript. Реакция браузера на ошибку JavaScript зависит от его типа. В браузере Internet Explorer в строке состояния появится желтая преду­преждающая пиктограмма. При двойном щелчке на ней будут выведены подробности

Рис. 6.2. Ошибка JavaScript, вызванная необработанным исключением Silverlight

Закончив разрабатывать приложение, измените автоматически генерируемый код обработки ошибок. Игнорировать все ошибки нельзя. Это приведет к проблемам с дан­ными. Создайте процедуру отбора ошибок, происходящих в определенных условиях, и закодируйте извещение о них пользователей.

Внимание!. О необходимости изменить обработчик ошибки Application .UnhandledException легко забыть, потому что он подключается, только когда приложение Silverlight выполняется без отладчика. При тестировании приложения в среде Visual Studio обработчик не вызывается, а необработанное исключение немедленно завершает приложение.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии