Исключения не будут всплывать - PullRequest
0 голосов
/ 14 ноября 2011

Я работаю над приложением для Windows Mobile.У меня есть форма главного меню с кнопками и все остальные формы запускаются отсюда.Каждый бит кода, который запускает дочернюю форму, помещается в блок try / catch.Если выдается исключение, оно регистрируется и отображается сообщение.Это единственное место, где я занимаюсь ошибками.В некоторых местах ниже по стеку в бизнес-слоях или слоях данных у меня может быть блок try / catch, но я просто добавляю некоторые детали к исключению и выбрасываю новый с исходным в качестве внутреннего исключения.

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

Обновление:

Большое спасибо за все предложения!Я не смог выбрать решение, хотя.Эта проблема продолжается уже некоторое время.Я вернусь и обновлю это, если когда-нибудь выясню, что происходит.

Ответы [ 4 ]

1 голос
/ 14 ноября 2011

Привет, Брэндон.Visual Studio останавливается на низкоуровневом исключении в слое данных с сообщением «Необработанное исключение».

Это нормально.В Visual Studio есть параметр «Инструменты -> Параметры -> Отладка», который называется «Включить Помощник по исключениям », который будет нарушать исключения.

Это облегчает отладку приложений.,Просто нажмите F5, чтобы приложение продолжалось, и вы увидите, что оно будет продолжать расти.

0 голосов
/ 02 августа 2016

Я просто сгорел от этого. Наконец я заметил проблему:

main()
{
   blah x = new blah(); //after a while I finally figured out this needs to
                        //be inside the try block with "//work"
   try
   {
      //work
   }
   catch
   {
      //I expected it to be handled here
   }
{

class blah
{
   blah()  //constructor
   {
       throw; //debugger tells me this is unhandled
   } 
 }
0 голосов
/ 14 ноября 2011

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

Однако обратите внимание (из документации MSDN): Это событие позволяет приложению Windows Forms обрабатывать необработанные исключения, возникающие в потоках Windows Forms. Присоедините ваши обработчики событий к событию ThreadException, чтобы обработать эти исключения, которые оставят ваше приложение в неизвестном состоянии. Где возможно, исключения должны обрабатываться блоком структурированной обработки исключений.

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);


    void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        // Handle
    }

Вы также можете добавить обработчик событий к событию AppDomain.UnhandledException . Важно отметить, что вы не сможете восстановить здесь. Тем не менее, вы как минимум сможете зарегистрировать исключение для дальнейшей отладки и уведомить пользователя. Следует соблюдать осторожность (снова из документации MSDN):

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

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        // Notify the user and log the exception
    }
0 голосов
/ 14 ноября 2011

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

    void SomeMethod()
    {
        try{
            ...
            ...
        }
        catch {}
    }

Очевидно, что это простоигнорируйте ошибку, а не передавайте ее по стеку.

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

...