【问题标题】:How to display my own exception?如何显示我自己的异常?
【发布时间】:2011-10-05 01:51:21
【问题描述】:

我正在开发一个需要添加自定义异常类的 Web 项目。例如,当会话超时发生时,如何显示来自自定义异常类的消息?请帮忙。任何示例都会有所帮助。

到目前为止,这是我在异常类中写的:

public class CustomException : Exception
{
    private string message;

    public CustomException ()
    {
        this.message = "Invalid Query";
    }
    public CustomException (String message)
    {
        this.message = message;

    }

}

需要知道如何将其与会话超时联系起来,从那里我需要编写相同的逻辑。谢谢。

【问题讨论】:

  • 发生会话超时时为什么要抛出自定义异常?
  • 我试图在从 A 层执行查询时返回批量数据,并在 A 层的会话超时时返回 null。它不会在 A 层显示任何错误。所以我需要为此使用自定义异常。

标签: c# asp.net custom-exceptions


【解决方案1】:

你可能想把它写成

public CustomException() : base("Invalid Query") { }

这样异常消息可以正确传递给其他构造函数

public CustomException(String message) : base(message) { }

那么你就不需要私有字符串消息字段了。

【讨论】:

  • 感谢您的回复。如果我正在编写像 dt=q.ExecuteQuery(); 这样的代码在 try 块中,我的异常类如何知道抛出的异常是否是会话超时异常,以便显示消息。
  • 如果是自定义异常,您应该自己抛出它,您应该让 ExecuteQuery()(除非您自己编写)抛出适当的异常。如果它被您抛出,只需捕获 (CustomException e)
  • 这意味着。我必须在我的应用程序代码本身中检查会话超时...而不是在异常类中。
  • 是的,您应该捕获 SessionTimeoutException 或通过将其作为捕获的“参数”而调用的任何内容
【解决方案2】:

如果您希望在引发时抛出自定义 exception,您可以这样做。

try {
    DataTable dt = q.ExecuteQuery(); //This throws a timeout.
} catch(SessiontTimeoutException ste) {
    throw new CustomException("Session has timed out");
} catch(Exception e) {
    //Show unexpected exception has occured
}

不太确定这是否是您想要做的。
更新:
要了解 SqlException 是否为 TimeoutException,请参阅StackOverFlow Post.

【讨论】:

  • 您也应该(几乎)始终将原始异常包含为 InnerException:throw new CustomException("Session has timed out", ste)
  • @Dan Puzey,同意了。您对问题的了解越多越好。
  • 这个 SessionTimeoutException 是什么?找不到相同的指令。
  • ??我是从你的帖子里拿的。您是在谈论 TimeoutException、SQL TimeoutException 还是实际的 Asp.net 会话超时异常?你得到了很多。
  • System.Data.SqlClient.SqlException:超时已过期。
【解决方案3】:

SqlException 类公开属性Errors,它是SqlError 对象的集合。您可以查询与master.dbo.sysmessages表中的条目对应的每个错误对象的Number属性。

【讨论】:

    【解决方案4】:

    我建议您使用Inner Exception 来获取用户友好的异常消息以及系统错误消息。如果收到MyException,您将在MyException.ToString() 看到您的异常消息和系统异常消息。

    另外,如果你担心编码异常,你可以使用 VS 的 Code Snippet Feature。只需输入 'Exception' 并按两次 TAB 键,VS 将创建 Exception 类,代码如下。

    try
    {
        DataTable dt = q.ExecuteQuery(); //This throws a timeout.
    }
    catch (SessiontTimeoutException ex)
    {
        throw new MyException("my friendly exception message", ex);
    }
    
    [Serializable]
    public class MyException : Exception
    {
        public MyException() { }
        public MyException(string message) : base(message) { }
        public MyException(string message, Exception inner) : base(message, inner) { }
        protected MyException(
          System.Runtime.Serialization.SerializationInfo info,
          System.Runtime.Serialization.StreamingContext context)
            : base(info, context) { }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2016-08-22
      • 2013-12-21
      • 1970-01-01
      • 2017-08-17
      • 2011-03-15
      相关资源
      最近更新 更多