如何检查异常对象的 InnerException 属性 是否为空?

How can I check if the InnerException property of the Exception object is null?

<%@ 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;
        }
    }
}

大家好,

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

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

你可以这样做:

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

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

如果您只需要一条 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);