Обработка ошибок windows forms

A few more bits …

You absolutely should have a centralized exception handling policy in place. This can be as simple as wrapping Main() in a try/catch, failing fast with a graceful error message to the user. This is the «last resort» exception handler.

Preemptive checks are always correct if feasible, but not always perfect. For example, between the code where you check for a file’s existence and the next line where you open it, the file could have been deleted or some other issue may impede your access. You still need try/catch/finally in that world. Use both the preemptive check and the try/catch/finally as appropriate.

Never «swallow» an exception, except in the most well-documented cases when you are absolutely, positively sure that the exception being thrown is livable. This will almost never be the case. (And if it is, make sure you’re swallowing only the specific exception class — don’t ever swallow System.Exception.)

When building libraries (used by your app), do not swallow exceptions, and do not be afraid to let the exceptions bubble up. Do not re-throw unless you have something useful to add. Do not ever (in C#) do this:

throw ex;

As you will erase the call stack. If you must re-throw (which is occasionally necessary, such as when using the Exception Handling Block of Enterprise Library), use the following:

throw;

At the end of the day, the very vast majority of exceptions thrown by a running application should be exposed somewhere. They should not be exposed to end users (as they often contain proprietary or otherwise valuable data), but rather usually logged, with administrators notified of the exception. The user can be presented with a generic dialog box, maybe with a reference number, to keep things simple.

Exception handling in .NET is more art than science. Everyone will have their favorites to share here. These are just a few of the tips I’ve picked up using .NET since day 1, techniques which have saved my bacon on more than one occasion. Your mileage may vary.

Обработка исключений в приложении, способы сбра информации об исключениях, настройка провайдера для отчета об ошибках, обработка неотловленных исключений, настройка лога сообщений

Flexberry Platform в сборке ICSSoft.STORMNET.UI.dll содержит классы для обработки исключительных ситуаций.

Простое отображение ошибки

Стандартный сценарий отображения Exception в специальной форме выглядит так:

try
{
  throw new Exception("Опаньки!");
  //...
}
catch(Exception ex)
{
  ErrorBox.Show(ex);
}

Способы сбора информации об исключениях

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

Итак, чтобы получить снимки экрана:

//Сделаем снимок только формы
Bitmap screen1 = ErrorBox.CaptureScreenShot(formToCapture);
//или снимем весь экран
Bitmap screen2 = ErrorBox.CaptureScreenShot();

Для того чтобы вывести эти снимки и сообщение:

//...
catch(Exception ex)
{
  List<Bitmap> screens = new List<Bitmap>();
  screens.Add(screen1);
  screens.Add(screen2);
  ErrorBox.Show(ex, screens, "Дополнительная информация об ошибке: переменная Х имеет значение:" + X);
}

Провайдеры отчётов об ошибках

Пользователь имеет возможность выгрузить информацию об ошибке, нажав на соответствующую кнопку на форме ошибки. По-умолчанию доступны 3 провайдера отчётов об ошибках:

  • Сохранить отчёт об ошибке на диск
  • Отправить отчет по электронной почте
  • Скопировать информацию в буфер обмена

Первые 2 варианта поддерживают сохранение изображений экрана (вся информация помещается в один zip-файл). В буфер обмена попадает только текстовая информация.

Чтобы добавить свой провайдер отчёта об ошибке, нужно унаследоваться от интерфейса IBugReportProvider и в конфигурационном файле добавить настройку BugReportProviders, в которой указать полные имена типов провайдеров, разделённые вертикальной чертой.

Важно: нельзя подключить 2 провайдера с одинаковым MenuItemName (будет подключен только первый из них).

Для работы с данными ошибки можно использовать статические методы класса ErrorBox.

Отправка сообщения об ошибке по электронной почте

В стандартном окне сообщения об ошибке существует возможность отправить письмо с сообщением об ошибке.

Форма исключения

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

Для запуска почтового клиента используется интерфейс MAPI. Адрес отправки, заголовок и текст сообщения могут быть настроены в конфигурационном файле приложения с помощью ключей BugReportEmailAddress, BugReportEmailTitle, BugReportEmailBody.

Пример:

<add key="BugReportEmailAddress" value="user@perm.ru" />
<add key="BugReportEmailTitle" value="Ошибка в Кошках или Лапах" />
<add key="BugReportEmailBody" value="Текст сообщения" />

Если указанный ключи не определены в конфигурационном файле, используются значение по умолчанию.

Адрес: пробел (пустую строку MAPI не принимает).

Тема: Ошибка {ИмяИсполнимогоФайла}.

Текст сообщения: В процессе работы пользователя {ИмяWindowsПользователя} в программе { ИмяИсполнимогоФайла} произошла ошибка. Дополнительная информация находится во вложении.

Замечание:

Для временного хранения архива используется папка Environment.SpecialFolder.InternetCache. Однако файл автоматически не удаляется, т.к. он не может быть удален до отправки сообщения.

Добавление информации о прикладной системе

Класс ICSSoft.STORMNET.Windows.Forms.ErrorBox содержит статический делегат, который позволяет собрать информацию о системе для того, чтобы она попала в информацию об ошибке.

/// <summary>
/// Делегат для сбора информации о прикладной системе
/// </summary>
/// <returns></returns>
public delegate string GetCurrentAppInfoDelegate();

/// <summary>
/// Делегат, который должен собрать информацию о прикладном приложении. Его результат будет присобачен к общей информации о системе.
/// </summary>
public static GetCurrentAppInfoDelegate GetCurrentAppInfo = null;

Обработка неотловленных исключений в прикладных системах

Чтобы пользователям не показывалась “страшная” форма с информацией об ошибке, если случилось неотловленное исключение, нужно подписаться на события Application.ThreadException и System.AppDomain.CurrentDomain.UnhandledException для того чтобы обработать их правильным образом.

Генератор приложений Flexberry добавляет строки

System.Windows.Forms.Application.ThreadException += ICSSoft.STORMNET.Windows.Forms.ErrorBox.ApplicationThreadException;
System.AppDomain.CurrentDomain.UnhandledException += ICSSoft.STORMNET.Windows.Forms.ErrorBox.CurrentDomainUnhandledException;

в метод Main приложения (в скобках программиста). Обработчики ICSSoft.STORMNET.Windows.Forms.ErrorBox.ApplicationThreadException и ICSSoft.STORMNET.Windows.Forms.ErrorBox.CurrentDomainUnhandledException просто запускают стандартную ErrorForm с информацией об исключении. Если требуется особая логика, то можно использовать собственный обработчик события.

Подключение лога ошибок

Чтобы включить лог ошибок достаточно указать такой атрибут в файле конфигурации:

<add key="ErrorLog" value="true" />

Все ErrorBox будут записывать ошибки в csv-файл в папку с приложением.

Студворк — интернет-сервис помощи студентам

Разработать приложение Windows Forms, реализующее обработку различных исключений Format Exception, Index out of Range и извещающую пользователя об обработке соответствующих исключений:
1) деление на ноль
2) исключение формата
3) иск. выхода пар-ра за границы
Это я сделала, а вот какую еще можно взять функцию, которая обрабатывала еще одно исключение?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
double a = 0;
double b = 0;
try
{
a = Convert.ToDouble(textBox1.Text);
b = Convert.ToDouble(textBox2.Text);
}
catch (System.Exception ex)
{
MessageBox.Show(«Ошибка формата!»);
}
label2.Text = Convert.ToString(a + b);
}

private void button2_Click(object sender, EventArgs e)
{
string[] s1 = new string[2] { «Иванов И.И.», «Петрова В.А»};
try
{
int i = Convert.ToInt16(textBox3.Text)-1;
label3.Text = s1[i];
}
catch (System.Exception ex1)
{
label3.Text = «Ошибка, неверные данные!»;
}

}

private void button3_Click(object sender, EventArgs e)
{
int a, b, result = 0;

try
{

a = Convert.ToInt16(textBox4.Text);
b = Convert.ToInt16(textBox5.Text);

result = a / b;
label6.Text = result.ToString();
}
catch (System.Exception ex2)
{
label6.Text = «Ошибка. Неверные данные или деление на 0»;
}

}

private void Form1_Load(object sender, EventArgs e)
{

}
}
}

Содержание

  1. Обработка исключений
  2. Конструкция try..catch..finally
  3. Обработка исключений и условные конструкции
  4. Обработка исключений в winforms-приложениях
  5. Простое отображение ошибки
  6. Способы сбора информации об исключениях
  7. Провайдеры отчётов об ошибках
  8. Отправка сообщения об ошибке по электронной почте
  9. Добавление информации о прикладной системе
  10. Обработка неотловленных исключений в прикладных системах
  11. Подключение лога ошибок
  12. обработка исключений
  13. Лучшие методики обработки исключений
  14. Использование блоков try/catch/finally для восстановления после ошибок или высвобождения ресурсов
  15. Обработка общих условий без выдачи исключений
  16. Устранение исключений при разработке классов
  17. Выдача исключений вместо возврата кода ошибки
  18. Завершайте имена классов исключений словом Exception
  19. Включение трех конструкторов в пользовательские классы исключений
  20. Обеспечение доступности данных об исключении при удаленном выполнении кода
  21. Использование грамматически правильных сообщений об ошибке
  22. Включение локализованной строки сообщения в каждое исключение
  23. Предоставление дополнительных свойств в пользовательских исключениях по мере необходимости
  24. Размещение операторов throw для удобной трассировки стека
  25. Использование методов построителя исключений
  26. Восстановление состояния, если методы не выполняются из-за исключения
  27. Обработка необработанных исключений (C#)
  28. Введение
  29. Исполнение кода при Error возникновении события
  30. Получение сведений о необработанном исключении
  31. Уведомление разработчика при возникновении необработанного исключения
  32. Что насчет использования пользовательской страницы ошибок
  33. Сводка
  34. Дополнительные материалы

Обработка исключений

Конструкция try..catch..finally

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

Рассмотрим следующий пример:

В данном случае происходит деление числа на 0, что приведет к генерации исключения. И при запуске приложения в режиме отладки мы увидим в Visual Studio окошко, которое информирует об исключении:

2.10

И в этом случае единственное, что нам остается, это завершить выполнение программы.

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

выполнение программы остановится. CLR найдет блок catch и передаст управление этому блоку.

После блока catch будет выполняться блок finally.

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

И, наоборот, при наличии блока finally мы можем опустить блок catch и не обрабатывать исключение:

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

Обработка исключений и условные конструкции

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

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

Источник

Обработка исключений в winforms-приложениях

Flexberry Platform в сборке ICSSoft.STORMNET.UI.dll содержит классы для обработки исключительных ситуаций.

Простое отображение ошибки

Стандартный сценарий отображения Exception в специальной форме выглядит так:

Способы сбора информации об исключениях

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

Итак, чтобы получить снимки экрана:

Для того чтобы вывести эти снимки и сообщение:

Провайдеры отчётов об ошибках

Пользователь имеет возможность выгрузить информацию об ошибке, нажав на соответствующую кнопку на форме ошибки. По-умолчанию доступны 3 провайдера отчётов об ошибках:

Первые 2 варианта поддерживают сохранение изображений экрана (вся информация помещается в один zip-файл). В буфер обмена попадает только текстовая информация.

Важно: нельзя подключить 2 провайдера с одинаковым MenuItemName (будет подключен только первый из них).

Отправка сообщения об ошибке по электронной почте

В стандартном окне сообщения об ошибке существует возможность отправить письмо с сообщением об ошибке.

error form

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

Пример:

Если указанный ключи не определены в конфигурационном файле, используются значение по умолчанию.

Адрес: пробел (пустую строку MAPI не принимает).

Текст сообщения: В процессе работы пользователя <ИмяWindowsПользователя>в программе < ИмяИсполнимогоФайла>произошла ошибка. Дополнительная информация находится во вложении.

Замечание:

Добавление информации о прикладной системе

Класс ICSSoft.STORMNET.Windows.Forms.ErrorBox содержит статический делегат, который позволяет собрать информацию о системе для того, чтобы она попала в информацию об ошибке.

Обработка неотловленных исключений в прикладных системах

Чтобы пользователям не показывалась “страшная” форма с информацией об ошибке, если случилось неотловленное исключение, нужно подписаться на события Application.ThreadException и System.AppDomain.CurrentDomain.UnhandledException для того чтобы обработать их правильным образом.

Генератор приложений Flexberry добавляет строки

в метод Main приложения (в скобках программиста). Обработчики ICSSoft.STORMNET.Windows.Forms.ErrorBox.ApplicationThreadException и ICSSoft.STORMNET.Windows.Forms.ErrorBox.CurrentDomainUnhandledException просто запускают стандартную ErrorForm с информацией об исключении. Если требуется особая логика, то можно использовать собственный обработчик события.

Подключение лога ошибок

Чтобы включить лог ошибок достаточно указать такой атрибут в файле конфигурации:

Все ErrorBox будут записывать ошибки в csv-файл в папку с приложением.

Источник

обработка исключений

Разработать приложение Windows Forms, реализующее обработку различных исключений Format Exception, Index out of Range и извещающую пользователя об обработке соответствующих исключений:
1) деление на ноль
2) исключение формата
3) иск. выхода пар-ра за границы
Это я сделала, а вот какую еще можно взять функцию, которая обрабатывала еще одно исключение?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
<
public partial class Form1 : Form
<
public Form1()
<
InitializeComponent();
>

private void button1_Click(object sender, EventArgs e)
<
double a = 0;
double b = 0;
try
<
a = Convert.ToDouble(textBox1.Text);
b = Convert.ToDouble(textBox2.Text);
>
catch (System.Exception ex)
<
MessageBox.Show(«Ошибка формата!»);
>
label2.Text = Convert.ToString(a + b);
>

private void button2_Click(object sender, EventArgs e)
<
string[] s1 = new string[2] < «Иванов И.И.», «Петрова В.А»>;
try
<
int i = Convert.ToInt16(textBox3.Text)-1;
label3.Text = s1[i];
>
catch (System.Exception ex1)
<
label3.Text = «Ошибка, неверные данные!»;
>

private void button3_Click(object sender, EventArgs e)
<
int a, b, result = 0;

a = Convert.ToInt16(textBox4.Text);
b = Convert.ToInt16(textBox5.Text);

result = a / b;
label6.Text = result.ToString();
>
catch (System.Exception ex2)
<
label6.Text = «Ошибка. Неверные данные или деление на 0»;
>

private void Form1_Load(object sender, EventArgs e)
<

Источник

Лучшие методики обработки исключений

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

Использование блоков try/catch/finally для восстановления после ошибок или высвобождения ресурсов

Обработка общих условий без выдачи исключений

Если состояние подключения перед закрытием не проверяется, исключение InvalidOperationException можно перехватить.

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

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

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

Устранение исключений при разработке классов

Класс может предоставлять методы и свойства, позволяющие избежать вызова, способного выдать исключение. Например, класс FileStream содержит методы, позволяющие определить, достигнут ли конец файла. Это позволяет избежать появления исключения, создаваемого в случае выполнения чтения после окончания файла. В следующем примере показан способ чтения до конца файла без выдачи исключения.

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

Выдача исключений вместо возврата кода ошибки

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

Создавайте новый класс исключений, только если предопределенное исключение не подходит. Пример:

Вызывайте исключение InvalidOperationException, если значение свойства или вызов метода не соответствуют текущему состоянию объекта.

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

Завершайте имена классов исключений словом Exception

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

Включение трех конструкторов в пользовательские классы исключений

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

Exception(), использующий значения по умолчанию.

Exception(String), принимающий строковое сообщение.

Exception(String, Exception), принимающий строковое сообщение и внутреннее исключение.

Обеспечение доступности данных об исключении при удаленном выполнении кода

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

Поместите эту сборку в общую базу приложения, совместно используемую обоими доменами приложений.

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

Использование грамматически правильных сообщений об ошибке

Составляйте понятные предложения, указывая в конце знаки препинания. Каждое предложение в строке, назначенной свойству Exception.Message, должно заканчиваться точкой. Например, «Таблица журнала переполнена.» будет подходящей строкой сообщения.

Включение локализованной строки сообщения в каждое исключение

Сообщение об ошибке, показываемое пользователю, извлекается из свойства Exception.Message созданного исключения, а не из имени класса исключения. Как правило, вы присваиваете значение свойству Exception.Message, передав строку сообщения аргументу message конструктора исключений.

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

Предоставление дополнительных свойств в пользовательских исключениях по мере необходимости

Дополнительные сведения (кроме строки настраиваемого сообщения) включайте в исключение только в случаях, когда в соответствии со сценарием программирования такие дополнительные сведения могут оказаться полезными. Например, исключение FileNotFoundException предоставляет свойство FileName.

Размещение операторов throw для удобной трассировки стека

Использование методов построителя исключений

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

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

Восстановление состояния, если методы не выполняются из-за исключения

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

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

Один из способов обработки в этой ситуации заключается в перехвате всех исключений, выданных транзакцией начисления средств, и откате транзакции списания средств.

В этом примере показано использование throw для повторного порождения исходного исключения. Это позволяет вызывающим объектам проще установить фактическую причину проблемы, не обращаясь к свойству InnerException. Альтернативным способом является выдача нового исключения с включением исходного исключения в качестве внутреннего:

Источник

Обработка необработанных исключений (C#)

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

Введение

При возникновении необработанного исключения в приложении ASP.NET оно передается в среду выполнения ASP.NET, которая вызывает Error событие и отображает соответствующую страницу ошибки. Существует три разных типа страниц ошибок: желтый экран «ошибка времени выполнения» (ИСОД); Сведения об исключении ИСОД; и пользовательские страницы ошибок. В предыдущем учебном курсе мы настроили приложение на использование настраиваемой страницы ошибок для удаленных пользователей и сведений об исключении, исод для пользователей, посещенных локально.

Использование удобной для пользователя настраиваемой страницы ошибок, которая соответствует внешнему интерфейсу веб-узла, является предпочтительным для ошибки времени выполнения по умолчанию ИСОД, но отображение пользовательской страницы ошибки — лишь одна часть комплексного решения по обработке ошибок. При возникновении ошибки в приложении в рабочей среде важно, чтобы разработчики получали извещение об ошибке, чтобы они могли неземлеть причину исключения и устранить ее. Более того, сведения об ошибке необходимо регистрировать, чтобы можно было исследовать и диагностировать ошибку в более позднем моменте времени.

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

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

Исполнение кода при Error возникновении события

События предоставляют объекту механизм для сигнализации о том, что произошло нечто интересное, а другой объект — для выполнения кода в ответе. Как разработчик ASP.NET вы привыкли думать о событиях. Если вы хотите выполнить некоторый код, когда посетитель щелкнет определенную кнопку, создайте обработчик событий для этого Click события кнопки и вставьте в него код. Учитывая, что среда выполнения ASP.NET создает свое Error событие всякий раз, когда возникает необработанное исключение, оно следует за тем, чтобы код для записи сведений об ошибке перейдет в обработчик событий. Но как создать обработчик событий для Error события?

image2

При развертывании приложения ASP.NET необходимо скопировать Global.asax файл в рабочую среду. Global.asax.cs Файл, созданный в WAP, не нужно копировать в рабочую среду, так как этот код компилируется в сборку проекта.

Аналогичным образом можно удалить все обработчики событий, созданные ненужным шаблоном глобального класса приложений. Для этого учебника требуется обработчик событий только для Error события. Удалите другие обработчики событий из Global.asax файла.

Получение сведений о необработанном исключении

На этом этапе у нас есть файл Global. asax с Application_Error обработчиком событий. При выполнении этого обработчика событий необходимо уведомить разработчика об ошибке и записать сведения о нем. Для выполнения этих задач сначала необходимо определить сведения о возникшем исключении. Используйте GetLastError метод объекта Server для получения сведений о необработанном исключении, которое привело Error к срабатыванию события.

На этом этапе у вас есть вся информация, необходимая для написания кода, который будет записывать сведения об исключении в таблицу базы данных. Можно создать таблицу базы данных со столбцами для каждой из подробных сведений об ошибках — типа, сообщения, трассировки стека и т. д. Вместе с другими полезными сведениями, такими как URL-адрес запрашиваемой страницы и имя пользователя, выполнившего вход в систему. В Application_Error обработчике событий можно подключиться к базе данных и вставить в нее запись. Аналогичным образом можно добавить код для оповещения разработчика об ошибке по электронной почте.

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

Уведомление разработчика при возникновении необработанного исключения

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

Элемент содержит параметры SMTP-сервера, используемые SmtpClient классом при отправке сообщения электронной почты. У компании, в которой размещен веб-узел, вероятно, есть SMTP-сервер, который можно использовать для отправки электронной почты из приложения. Дополнительные сведения о параметрах SMTP-сервера, которые следует использовать в приложении, см. в разделе о поддержке веб-узла.

Добавьте следующий код в Application_Error обработчик событий, чтобы отправить разработчику сообщение электронной почты при возникновении ошибки:

image5

Рис. 2. разработчик отправил уведомление по электронной почте при наличии необработанного исключения
(Щелкните, чтобы просмотреть изображение с полным размером)

image8

Рис. 3. уведомление по электронной почте содержит сведения об исключении Исод в виде вложения
(Щелкните, чтобы просмотреть изображение с полным размером)

Что насчет использования пользовательской страницы ошибок

В этом учебнике было показано, как использовать Global.asax и Application_Error обработчик событий для выполнения кода при возникновении необработанного исключения. В частности, мы использовали этот обработчик событий для уведомления разработчика об ошибке; Мы можем расширить его, чтобы также регистрировать сведения об ошибке в базе данных. Наличие Application_Error обработчика событий не влияет на работу конечного пользователя. Они по-прежнему видят настроенную страницу ошибки, сведения об ошибке ИСОД, ошибку времени выполнения ИСОД или настраиваемую страницу ошибки.

image11

Рис. 4. при возникновении ошибки браузер перенаправляется на URL-адрес настраиваемой страницы ошибок
(Щелкните, чтобы просмотреть изображение с полным размером)

Побочным результатом является то, что запрос, в котором произошло необработанное исключение, заканчивается, когда сервер отвечает на перенаправление HTTP 302. Последующий запрос к пользовательской странице ошибок — это новый запрос. к этому моменту модуль ASP.NET отменил сведения об ошибке и, более того, не имеет способа связать необработанное исключение в предыдущем запросе с новым запросом для настраиваемой страницы ошибки. Именно поэтому функция GetLastError возвращает null при вызове со страницы настраиваемой ошибки.

Тем не менее, пользовательская страница ошибок может быть выполнена во время того же запроса, что привело к ошибке. Server.Transfer(url) Метод передает выполнение на указанный URL-адрес и обрабатывает его в рамках одного запроса. Код в Application_Error обработчике событий можно переместить в класс кода программной части пользовательской страницы ошибки, заменив его в Global.asax следующим кодом:

Теперь при возникновении необработанного исключения Application_Error обработчик событий передает управление соответствующей пользовательской странице ошибок на основе кода состояния HTTP. Так как управление было передано, пользовательская страница ошибки имеет доступ к необработанным сведениям об исключении через Server.GetLastError и может уведомлять разработчика об ошибке и записывать сведения о ней. Server.Transfer Вызов останавливает выполнение обработчика ASP.NET, перенаправляющего пользователя на настраиваемую страницу ошибки. Вместо этого содержимое страницы пользовательской ошибки возвращается в качестве ответа на страницу, вызвавшую ошибку.

Сводка

При возникновении необработанного исключения в веб-приложении ASP.NET среда выполнения ASP.NET создает Error событие и отображает настроенную страницу ошибки. Мы можем уведомить разработчика об ошибке, записать сведения о ней или обработать ее другим способом, создав обработчик событий для события ошибки. Существует два способа создания обработчика событий для HttpApplication таких событий, как Error : в Global.asax файле или в модуле HTTP. В этом учебнике было показано, как создать Error обработчик событий в Global.asax файле, который уведомляет разработчиков об ошибке с помощью сообщения электронной почты.

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

Поздравляем с программированием!

Дополнительные материалы

Дополнительные сведения о разделах, обсуждаемых в этом руководстве, см. в следующих ресурсах:

Источник

Permalink

Cannot retrieve contributors at this time

title description ms.date dev_langs helpviewer_keywords ms.assetid

How to: Handle Errors and Exceptions that Occur with Databinding

Learn how to handle errors and exceptions that occur with databinding so that you can recover or pass the error information to the user.

03/30/2017

csharp

vb

cpp

error handling [Windows Forms], examples

data binding [Windows Forms], examples

examples [Windows Forms], error handling

error handling [Windows Forms], data binding

data binding [Windows Forms], error handling

BindingSource component [Windows Forms], handling errors and exceptions

eddc5bad-9513-47df-ab28-f02d8dff7892

Oftentimes exceptions and errors occur on the underlying business objects when you bind them to controls. You can intercept these errors and exceptions and then either recover or pass the error information to the user by handling the xref:System.Windows.Forms.Binding.BindingComplete event for a particular xref:System.Windows.Forms.Binding, xref:System.Windows.Forms.BindingSource, or xref:System.Windows.Forms.CurrencyManager component.

Example

This code example demonstrates how to handle errors and exceptions that occur during a data-binding operation. It demonstrates how to intercept errors by handling the xref:System.Windows.Forms.Binding.BindingComplete?displayProperty=nameWithType event of the xref:System.Windows.Forms.Binding objects. In order to intercept errors and exceptions by handling this event, you must enable formatting for the binding. You can enable formatting when the binding is constructed or added to the binding collection, or by setting the xref:System.Windows.Forms.Binding.FormattingEnabled%2A property to true.

[!code-cppSystem.Windows.Forms.DataConnectorBindingComplete#3]
[!code-csharpSystem.Windows.Forms.DataConnectorBindingComplete#3]
[!code-vbSystem.Windows.Forms.DataConnectorBindingComplete#3]

When the code is running and an empty string is entered for the part name or a value less than 100 is entered for the part number, a message box appears. This is a result of handling the xref:System.Windows.Forms.Binding.BindingComplete?displayProperty=nameWithType event for these textbox bindings.

Compiling the Code

This example requires:

  • References to the System, System.Drawing and System.Windows.Forms assemblies.

See also

  • xref:System.Windows.Forms.Binding.BindingComplete?displayProperty=nameWithType
  • xref:System.Windows.Forms.BindingSource.BindingComplete?displayProperty=nameWithType
  • BindingSource Component

Понравилась статья? Поделить с друзьями:
  • Обработка ошибок matlab
  • Обработка ошибок vba outlook
  • Обработка ошибок kotlin
  • Обработка ошибок vba on error
  • Обработка ошибок json python