如何检查Exception对象的InnerException属性是否为null?

时间:2017-11-30 04:29:29

标签: asp.net exception inner-exception

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Error.aspx.cs" Inherits="XEx21HandleErrors.Error" %>

<asp:Content ContentPlaceHolderID="mainPlaceholder" runat="server">
    <h1 class="text-danger">An error has occurred</h1>
    <div class="alert alert-danger">
        <p><asp:Label ID="lblError" runat="server"></asp:Label></p>
    </div>
    <asp:Button ID="btnReturn" runat="server" Text="Return to Order Page" 
        PostBackUrl="~/Order.aspx" CssClass="btn btn-danger" />
</asp:Content>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace XEx21HandleErrors
{
    public partial class Error : System.Web.UI.Page
    {
        private Exception ex;
        protected void Page_Load()
        {

            if (ex.InnerException == null)
            {
                lblError.Text = ex.Message;
            }
            else ex.InnerException;
        }
    }
}

大家好,

我正在开发一个应用程序,我想在其中检查Exception对象的InnerException属性是否为null。如果是,则显示Exception对象的Message属性。 否则,显示对由InnerException属性返回的异常对象的消息属性。这是我到目前为止所拥有的。为了做到这一点,我问,我已经创建了一个Page_Load事件处理程序,但我被困在else部分。有人能帮我吗?我还包括错误页面,以防有人想知道这个异常错误消息将在何处显示。

2 个答案:

答案 0 :(得分:0)

.NET实际上有一种方法可以解决您的问题,而无需您自己进行测试。

你可以这样做:

var rootCause = ex.GetBaseException();
lblError.Text = rootCause.Message;

GetBaseException()实际上会递归地向下走InnerException链,直到它到达InnerException为空的最后一个异常。

答案 1 :(得分:0)

如果您只需要一条InnerException消息,则可以将其作为

进行访问
if (ex.InnerException == null)
{
    lblError.Text = ex.Message;
}
else
{
    lblError.Text = ex.InnerException.Message;
}

或更短

lblError.Text = ex.InnerException?.Message ?? ex.Message;

InnerException中的例外也可能包含InnderException。如果您想访问最深的一个,可以使用以下递归方法:

static string UnwrapExceptionMessage(Exception ex)
{
    return ex.InnerException != null ? UnwrapExceptionMessage(ex.InnerException) : ex.Message;
}

lblError.Text = UnwrapExceptionMessage(ex);