例外不会冒泡

时间:2011-11-14 02:25:46

标签: c# winforms exception windows-mobile

我正在开发Windows Mobile应用程序。我有一个带有按钮的主菜单表单,所有其他表单都是从这里启动的。启动子表单的每一段代码都包含在try / catch块中。如果抛出异常,则会记录该异常并显示一条消息。这是我处理错误的唯一地方。在业务或数据层的堆栈中的某些地方,我可能有一个try / catch块,但我只是向异常添加一些细节,并抛出一个新的原始异常作为内部异常。

现在这一切似乎在大部分时间都可以正常工作。问题在于,有时异常会在业务或数据层中进一步抛出,并且它们不会在顶部冒出我的异常处理代码。我不知道为什么会这样。我没有做任何多线程或其他任何棘手的事情。

更新

非常感谢所有的建议!我无法选择解决方案。这个问题已经持续了一段时间。如果我弄清楚发生了什么,我会回来更新这个。

4 个答案:

答案 0 :(得分:1)

  你好布兰登。 Visual Studio在数据层中的低级异常处停止,并显示消息“Unhandled Exception”。

这很正常。视觉工作室中有一个设置在“工具 - >选项 - >调试”下,名为“启用Exception assistant”,它将在例外情况下中断。

这样可以更轻松地调试应用程序。只需按F5键让你的应用程序继续运行,你就会发现它会继续冒泡。

答案 1 :(得分:0)

听起来你已经涵盖了这种可能性,但只是为了彻底:你确定你在任何地方都没有以下任何东西......

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

显然,这只会忽略错误而不是将其传递给堆栈。

假设上述情况并非如此,那么您能否提供有关发生异常时会发生什么的更多详细信息?你知道有一个异常,因为弹出一个框告诉你它,你是否能够看到你的代码中发生异常的位置,或者你只看到你的代码行为不正确并假设发生异常?

答案 2 :(得分:0)

如果您打算通知用户并记录异常,可以尝试添加Application.ThreadException

但请注意(来自MSDN文档):此事件允许Windows窗体应用程序处理Windows窗体线程中出现的其他未处理的异常。将事件处理程序附加到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
    }

答案 3 :(得分:0)

我被这个烧了。最后我发现了问题:

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
   } 
 }