Почему win32 исключение не поймано c# механизмом обработки исключений

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

Ваше решение с соединением и затем заказывающий на display_order столбец является ближе всего правильным решением; что-либо еще - вероятно, определенный для DBMS взлом (или делает некоторый материал с функциями OLAP в стандартном SQL). Конечно, соединение является ближе всего портативным решением (хотя генерируя данные с display_order, значения могут быть проблематичными). Обратите внимание, что Вы, возможно, должны выбрать столбцы упорядочивания; это раньше было требованием в стандартном SQL, хотя я полагаю, что он был ослаблен, как правило, только что (возможно, уже в SQL-92).

14
задан Kevin Montrose 30 July 2009 в 12:08
поделиться

6 ответов

РЕДАКТИРОВАТЬ : как указал Pratik , следующий ответ относится только к .NET 1.0 и .NET 1.1. Начиная с .NET 2.0, исключение, не связанное с CLS, должно перехватываться как RuntimeWrappedException .


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

try {
} catch (Exception ex) {
    // .NET exception
} catch {
    // native exception
}

См. Перехват исключений, не совместимых с CLSC, в общих обработчиках для получения дополнительной информации.

15
ответ дан 1 December 2019 в 12:27
поделиться

Выполнение Application.Run не вызывает ошибки. Это происходит в другом потоке (или, по крайней мере, асинхронно).

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

3
ответ дан 1 December 2019 в 12:27
поделиться

Попробуйте подписаться на эти события до запуска приложения ( Application.Run ):

Затем вы можете избавиться от блока try catch .


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

2
ответ дан 1 December 2019 в 12:27
поделиться

Хотя я не знаю, почему ваш блок catch не работает попробуйте использовать событие Application ThreadException . Это должно поймать любую ошибку в потоках приложения. Добавьте обработчик событий перед вызовом Application.Run.

Для вашего второго ответа определенно да. Я разрабатываю и поддерживаю корпоративное приложение winforms, которое взаимодействует с серверной частью веб-службы в фоновых потоках. Если какой-либо вызов веб-службы завершается сбоем, обрабатывают событие threadxception приложения (а также appdomain unhandledexception), регистрируют и всплывают с ошибкой, о которой бизнес-пользователи могут сообщить, и разрешить им продолжить работу без сбоя приложения.

3
ответ дан 1 December 2019 в 12:27
поделиться

1) Исключения Win32 должны перехватываться. Может быть, исключение генерируется из фонового потока или из потока GC?

2) Это зависит от структуры вашего приложения. Например, если пользовательский интерфейс уведомления об ошибке каким-то образом был привязан к основной форме (например, вам нужно вызвать поток пользовательского интерфейса из рабочего потока), то было бы глупо отображать пользовательский интерфейс в блоке кода вне кода, который запускает сообщение. петля. Однако, если ваш пример кода однопоточный, все будет в порядке.

0
ответ дан 1 December 2019 в 12:27
поделиться

Вам может потребоваться перехватить как Win32Exception (или ExternalException) вместо

http://msdn.microsoft.com/en-us/library/system.componentmodel.win32exception.aspx

Кажется, я помню, что Win32Exception наследуется от ExternalException, но ExternalException не наследуется от Exception, поэтому ваш код не перехватит его.

Изменить: См. Другие ответы, почему это неправильно!

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

0
ответ дан 1 December 2019 в 12:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: