C# 例外情况获胜';不要冒泡

C# 例外情况获胜';不要冒泡,c#,winforms,exception,windows-mobile,C#,Winforms,Exception,Windows Mobile,我正在开发一个Windows Mobile应用程序。我有一个带有按钮的主菜单表单,所有其他表单都从这里启动。启动子窗体的每一位代码都包装在一个try/catch块中。如果引发异常,则会记录该异常并显示一条消息。这是我处理错误的唯一地方。在业务层或数据层中的某些位置,我可能会有一个try/catch块,但我只是简单地向异常添加一些细节,并抛出一个新的异常,其中原始异常作为内部异常 现在,这一切似乎在大多数情况下都能正常工作。问题是,有时异常会在业务层或数据层的更底层抛出,它们不会出现在顶部的异常处

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

现在,这一切似乎在大多数情况下都能正常工作。问题是,有时异常会在业务层或数据层的更底层抛出,它们不会出现在顶部的异常处理代码中。我不知道为什么会这样。我没有做任何多线程或其他棘手的事情

更新:


非常感谢所有的建议!但我还没能找到解决办法。这个问题已经持续了一段时间。如果我知道发生了什么事,我会回来更新这篇文章。

听起来你已经涵盖了这种可能性,但只是为了彻底了解:你确定你在任何地方都没有类似于以下内容的内容

    void SomeMethod()
    {
        try{
            ...
            ...
        }
        catch {}
    }
显然,这将忽略错误,而不是将其传递到堆栈中


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

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

但是请注意(来自MSDN文档):此事件允许Windows窗体应用程序处理Windows窗体线程中发生的未经处理的异常。将事件处理程序附加到ThreadException事件以处理这些异常,这将使应用程序处于未知状态。在可能的情况下,异常应由结构化异常处理块处理

您还可以向事件添加事件处理程序。需要注意的是,您将无法从这里恢复。但是,您至少可以记录异常以进行进一步调试,并通知用户。应注意(同样来自MSDN文档):

此事件提供未捕获异常的通知。它允许应用程序在系统默认处理程序向用户报告异常并终止应用程序之前记录有关异常的信息。如果有关应用程序状态的足够信息可用,则可以执行其他操作,例如保存程序数据以供以后恢复。建议谨慎,因为如果不处理异常,程序数据可能会损坏


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

这是正常的。VisualStudio中的“工具->选项->调试”下有一个名为“启用”的设置,它将在异常时中断


这是为了使调试应用程序更容易。只要按F5让你的应用程序继续运行,你就会看到它会继续冒泡。

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

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

谢谢你的回复,布兰登。不,我没有任何空的catch语句。当我看到其他开发人员编写这样的代码时,我很生气!发生的情况是,异常显示在通用windows错误屏幕中,并且我的顶级异常处理代码(在UI层中)从未被调用。如果我正在调试,那么VisualStudio将在抛出低级异常(在数据层中)的位置停止。这真的很奇怪。让我再问你几个问题:你说的VisualStudio刚刚停止是什么意思?它是在异常出现的地方“中断”以便您可以查看它,还是真的停止以便程序不再执行?如果你没有调试呢?然后它会使你的应用程序崩溃还是继续?另外,我会假设除了没有任何“空”catch语句外,你的catch语句都会重新引发一个异常。嗨,Brandon。Visual Studio在数据层中的低级异常处停止,并显示消息“Unhandled exception”。我这里的代码正在访问数据库,我有一个try/catch块,catch语句类似于“thrownewexception”(“Db Error”,ex);”如您所见,我将异常作为内部异常重新引用。如果可能,我将尝试的第一件事是注释掉try/catch行并导致错误。这至少有助于进一步隔离问题。我现在想到的唯一一件事是,异常(或InnerException)可能是在数据层dll中引用的类型,而不是它需要传递到的dll或exe中。老实说,我以前从来没有想过这一点,我不知道该如何处理。@jgauffin这会有所帮助,因为他正试图1)记录异常,2)向用户显示消息。至少可以在这些处理程序内部完成日志记录。不,他正在尝试让他的异常正确地沿调用堆栈向上移动。您是正确的,但是我的回答是试图解决我认为是代码意图的问题。我应该在回答之前加上这句话。问题指出:“启动子窗体的每一位代码都包装在一个try/catch块中。如果抛出异常,则会记录该异常并显示一条消息”。如果这是代码的真实意图,那么我的答案将达到预期的效果。那么您不应该包括
AppDomain.CurrentDomain.UnhandledException
,因为它不处理异常。应用程序将崩溃,无任何影响
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        // Notify the user and log the exception
    }
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
   } 
 }