Как я могу проверить, является ли свойство InnerException объекта 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;
        }
    }
}

Всем привет,

Я работаю над приложением, в котором я хочу проверить, является ли свойство InnerException объекта Exception нулевым. Если это так, отобразите свойство Message объекта Exception. В противном случае отобразите свойство Message объекта Exception, которое возвращается свойством InnerException. Вот что у меня так далеко. Для этого я прошу, я создал обработчик события Page_Load, но я застрял в другой части. Кто-нибудь может мне помочь? Я также включил страницу с ошибкой на случай, если кто-то захочет точно знать, где будет отображаться это сообщение об ошибке исключения.

2 ответа

Решение

Если вам нужно только сообщение 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);

.NET на самом деле имеет метод, который решит вашу проблему, без необходимости выполнять тестирование самостоятельно.

Вы можете просто сделать:

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

GetBaseException() на самом деле будет идти вниз по InnerException цепочка для вас рекурсивно, пока не дойдет до последнего исключения, где InnerException нулевой.

Другие вопросы по тегам