Как создать подробную страницу с ошибкой? - PullRequest
4 голосов
/ 11 марта 2009

Я хочу создать пользовательскую страницу ошибок для обработки всех необработанных исключений.

Я хочу перенаправить на него из метода Application_Error(object sender, EventArgs e), расположенного в Global.asax.cs. Как я могу показать в нем некоторую подробную информацию из исключения, которое выдает ошибку приложения?

Ответы [ 5 ]

3 голосов
/ 11 марта 2009

Я сделал то же, что вы говорите. Я создал ErrorPage, который отображает информацию для пользователя. Я также создал функцию, которая записывает информацию об ошибках в журналы событий ...

Для страницы, это то, что я делаю. Просто наклейте туда этикетки ...

protected void Page_Load(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError().GetBaseException();
    this.lblMessage.Text = ex.Message;
    this.lblSource.Text = ex.Source;
    this.lblStackTrace.Text = ex.StackTrace;
    if (AppProperties.AppEnv != AppEnvironment.PROD)
    {
        this.ErrorDetails.Visible = true;
    }
    else
    {
        this.ErrorDetails.Visible = false;
    }
    Utility.LogError();
    Server.ClearError();
}

Так выглядит функция LogError ...

public static void LogError()
{
    LogError(HttpContext.Current.Server.GetLastError().GetBaseException());
}

public static void LogError(Exception ex)
{
    EventLog log = new EventLog();
    if (ex != null)
    {
        log.Source = ConfigurationManager.AppSettings["EventLog"].ToString();
        StringBuilder sErrorMessage = new StringBuilder();
        if (HttpContext.Current.Request != null && HttpContext.Current.Request.Url != null)
        {
            sErrorMessage.Append(HttpContext.Current.Request.Url.ToString() + System.Environment.NewLine);
        }
        sErrorMessage.Append(ex.ToString());
        log.WriteEntry(sErrorMessage.ToString(), EventLogEntryType.Error);
    }
}
1 голос
/ 11 марта 2009

Вы можете получить последнее исключение из Server.GetLastError (). После того, как вы обработали ошибку, вы можете удалить ее, если хотите, вызвав Server.ClearError ().

Кстати, считается плохой практикой показывать слишком много конечному пользователю, что может оказаться уязвимостью безопасности. Кроме того, имейте в виду, что если вы перенаправите, а не вернете код ошибки 500 HTTP, различные боты не поймут, что они вызывают сбой, и продолжат выполнять те же самые неработающие запросы на вашем сайте. Поэтому обязательно используйте Server.Transfer (), а не Response.Redirect () и установите Response.StatusCode = 500.

0 голосов
/ 11 марта 2009

Почти всегда плохая идея показывать подробную информацию об ошибках конечным пользователям. В конечном итоге вы можете раскрыть все виды неподходящей информации: имена файлов, учетные данные базы данных, детали реализации и т. Д. Записать исключение в безопасное место (файл журнала, базу данных и т. Д.), Но не показывать его пользователю.

0 голосов
/ 11 марта 2009

На вашей странице сделайте что-то вроде этого:

ErrorLabel.Text = Server.GetLastError();

Это предполагает C #. Затем вы можете перенаправить из файла global.asax событие ApplicationError. Есть и другие способы справиться с этим, и я не рекомендую использовать сообщение об исключении, чтобы показать пользователю.

0 голосов
/ 11 марта 2009

Вы можете использовать Server.GetLastError (), чтобы получить исключение, выданное вашим приложением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...