【问题标题】:How do I bubble up an Exception to my UI?如何在我的 UI 中出现异常?
【发布时间】:2011-03-25 21:04:44
【问题描述】:

我有一个 aspx 页面,单击按钮会创建一个 serviceRefernece 对象的实例。在我的页面后面的代码中,我将调用包装在 try/catch 中。

        try
        {
            var client = GetClient();
            var request = new ActiveVerificationRequestDC();
            var response = client.GetActiveVerification(request);
            DoSomethingWithTheResponse(response);      

        }
        catch (FaultException ex)
        {
            LogError(ex, MethodBase.GetCurrentMethod().Name);
            throw;

        }
        catch (Exception ex)
        {
            var args = new[] { MethodBase.GetCurrentMethod().Name, ex.Message };
            DisplayError(args);
        }

引用的 svc 文件使用几乎相同的模式。它通过 net.tcp 调用内部客户端。调用包含在 try/catch 中

        try
        {
            var client = new InternalServiceClient();
            var response = client.GetActiveVerification(request);
            client.Close();
            return response;

        }
        catch (FaultException fe)
        {
            LogError(MethodBase.GetCurrentMethod().Name, fe);
            throw; 
        }

这是我的问题,如何让错误出现在我的 UI catch 语句中?当我这样离开时,我从 Visual Studio 收到一个未处理的异常错误。我尝试删除throw,这让我指定了一个返回值,然后我返回null。这会使 UI 无法正常工作。我已经尝试过throw new Exception(fe.message),但未处理的异常也遇到了同样的问题。基本上我的问题是我怎样才能完成我所需要的?我错过了什么?

【问题讨论】:

  • 未处理的异常听起来像是发生在服务边界上,因此 Visual Studio 会捕获它。 Visual Studio 不会让你继续执行吗?我想你的页面 catch (Exception ex)catch (FaultException ex) 捕获处理程序永远不会执行?

标签: c# asp.net exception exception-handling try-catch


【解决方案1】:

您需要在 try/catch 块周围有一个单独的 try/catch 块。你有它这样你就可以捕捉到一个 FaultException 和任何类型的异常,但是你的 Exception 块不会捕捉到你从 FaultException 中抛出的异常。因此,只需将其与另一个 try/catch 封装起来,或者在 FaultException 捕获和异常捕获中处理它。

【讨论】:

  • 或者您可以删除 ASPX 页面上的 catch (FaultException ex) 处理程序,具体取决于日志记录条件。
【解决方案2】:

原因可能是在您的第二个代码 sn-p 中引发了另一个不属于 FaultException 类型的异常;在这种情况下,这种异常将作为未处理的通过。也许您应该在第二个代码 sn-p 中添加另一个 catch 块,以捕获 Exception 类型的异常:

    catch (FaultException fe)
    {
        LogError(MethodBase.GetCurrentMethod().Name, fe);
        throw; 
    }

    catch (Exception ex)
    {
        throw;
    }

【讨论】:

    【解决方案3】:

    FaultException 是你重新抛出的泛型类型吗?任何FaultContract 属性详述的相关类是否可供此执行堆栈中的所有程序集访问?

    编辑:在你的第一个代码 sn-p ...

       catch (FaultException ex)
        {
            LogError(ex, MethodBase.GetCurrentMethod().Name);
            throw;
        }
    

    如果这个handler的throw语句出现未处理的错误,那么@MCain是对的。

    【讨论】:

      【解决方案4】:

      我相信你必须在 catch 块中抛出错误

      try
      {
      }
      catch (SqlException _SqlException)
      {
        //Log Error to file
        throw;
      }
      catch (IOException _IOexception)
      {
        //Log Error to file
        throw;
      }
      catch (Exception _exception)
      {
        //Log Error to file
        throw;
      }
      

      这种块会在调用方法中

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-01
        • 1970-01-01
        • 2014-09-16
        • 1970-01-01
        • 2010-12-13
        • 2010-10-22
        • 1970-01-01
        • 2012-04-22
        相关资源
        最近更新 更多