- Да, надо. Нет, все исключения в
Main
поймать нельзя.
- Есть несколько вариантов:
- Сообщение в стандартном WPF контроле в рамках основного окна (типа стандартного сообщения или всплывающего контрола).
- Стандартное WinAPI сообщение.
- Отдельное окно с WPF контролом и деталями сообщения.
- Да, вполне нормальный вариант.
В целом же, стандартный подход выглядит примерно так:
- Создаём несколько категорий исключений для разных ситуаций (условно - диск, приложение, загрузка, скачивание, сеть и т.п.)
- В каждой категории создаём несколько типов исключений, наследуя их от класса
Exception
и указывая параметры исключений
- На верхнем уровне ловим исключения, для каких-то определённых типов исключений можно добавлять отдельные ветки
- В обычных условиях просто выкидываем исключение, которое будет поймано на верхнем уровне
- В нестандартных условиях ловим на месте или показываем сообщение об ошибке с ожиданием
Это позволяет по типу или идентификатору исключения определить точное место, где это исключение произошло, а так же отделить свои исключения от чужих. Ну и плюс есть какой-то отдельный класс с методами для показа сообщений, ошибок и вопросов с возможностью вызвать его где и как угодно.
Реальный пример базового класса для исключения с локализацией:
/// <summary>
/// Localized exception
/// </summary>
/// <param name="stringId">i18n string Id</param>
/// <param name="args">String arguments for format</param>
public class I18nException(string stringId, object[] args)
: Exception(
string.Format(
I18n($"{ExceptionId} {stringId}"),
args))
{
public readonly object[] Args = args;
public readonly string StringId = stringId;
private const string ExceptionId = "Exception";
}
I18n(string str)
-
функция для получения локализованной строки для текущего языка приложения.
Ну и далее наследуем свои исключения от этого базового типа:
public class ElementNotFoundException(Type type, string name)
: I18nException(
"Element not found",
[type.FullName, name]
)
{
public readonly string ElementName = name;
public readonly Type ElementType = type;
}
(
тыц).