<%@ 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部分。有人能帮我吗?我还包括错误页面,以防有人想知道这个异常错误消息将在何处显示。
答案 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);