从C#,ASP.NET中的对象设置器中检索自定义异常消息

时间:2015-04-18 09:57:27

标签: c# asp.net visual-studio

我尝试在抛出FormatException时将用户重定向到Error页面,并检索在自定义异常类中生成的自定义消息。我需要使用origin(here:Product)类中捕获的异常。我使用会话状态来存储异常并检索原始异常。

使用下面的代码我得到了我需要的东西,唯一的问题是我无法检索自定义异常消息,我只是得到:

  

输入字符串的格式不正确。

虽然我需要获取自定义消息(没有原始消息)。

我调查了异常抛出的各种来源和方法,但我没有遇到过解决方案。

这就像我做的一个学术例子。这是我的自定义类

    public class Product
        {
            private int price;
            public int Price {
                get { return price; }
                set
                {
                    try
                    {
                        price = value;
                    }
                    catch (FormatException e)
                    {
                        throw new CustomException();
                    }
                }
            }

            public Product(int price) {
                this.Price = price;
            }
        }


    public class CustomException : FormatException
    {
        public CustomException() : base() { }
        public override string Message
        {
            get
            {
                return "Exception caught!";
            }
        }
    }

代码

public partial class Input : System.Web.UI.Page{
            protected void btn_Click(object sender, EventArgs e){
                Product product = new Product(Convert.ToInt32(txt.Text));
            }
    }

    public partial class ErrorPage : System.Web.UI.Page{
        protected void Page_Load(object sender, EventArgs e)
        {
            Exception err = Session["LastError"] as Exception;
            if (err != null)
            {
                err = err.GetBaseException();
                lblError.Text = err.Message;
            }
        }
    }

global.asax文件

    <%@ Application Codebehind="Global.asax.cs" 
Inherits="ExceptionTest.Global" Language="C#" %>

    <script runat="server">
        void Application_Error(object sender, EventArgs e){
                Exception err = Server.GetLastError();
                Session.Add("LastError", err);}

            void Session_Start(object sender, EventArgs e){
                Session["LastError"] = "";}
    </script>

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

当您尝试转换为Int32并且从未到达try-catch块时,会引发您的异常。如果您想测试CustomException,请尝试使用

protected void btn_Click(object sender, EventArgs e){
    try {            
       Product product = new Product(Convert.ToInt32(txt.Text));
    }
    catch (FormatException e)
    {
        throw new CustomException();
    }
}

<强>更新

如果您确实需要查看Product课程,则需要在此处转换文字。 (但这是个坏主意。尽快转换为预期类型)

您的代码将类似于:

public class Product
    {
        private int price;
        public int Price {
            get { return price; }
            set
            {
                 price = value;
            }
        }

        public Product(string price) {
                                try
                {
                    this.Price = Convert.ToInt32(price);
                }
                catch (FormatException e)
                {
                    throw new CustomException();
                }

        }
    }

你的“代码背后”:

public partial class Input : System.Web.UI.Page{
        protected void btn_Click(object sender, EventArgs e){
            Product product = new Product(txt.Text);
        }
}

答案 1 :(得分:0)

使用Html Encode清除错误消息。

 public partial class ErrorPage : System.Web.UI.Page{
        protected void Page_Load(object sender, EventArgs e)
        {
            Exception err = Session["LastError"] as Exception;
            if (err != null)
            {
                err = err.GetBaseException();
                lblError.Text = Server.HtmlEncode(err.Message);
            }
        }
    }