Как я могу проверить, является ли свойство 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
нулевой.