Как получить доступ к исходной ошибке, исходному файлу и номеру строки исключения для использования на пользовательской странице ошибки? - PullRequest
5 голосов
/ 18 июня 2010

В основном я хочу взять следующее: alt text

и сделать так, чтобы оно соответствовало стилю остальной части приложения.

Я создаю пользовательскую страницу ошибок в моем C # на основепроект, и я хочу, чтобы он мог показывать ту же информацию, которая отображается на странице ошибок ASP.NET по умолчанию.Из игры с отражателем я вижу, что это генерируется через HttpException.GetHtmlErrorMessage(), но когда я пытаюсь использовать это в моем исключении, он возвращает null.

Ответы [ 4 ]

2 голосов
/ 08 февраля 2012

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

Во-первых, нужно фактически разбить трассировку стека и получить кадр верхнего уровня.

var st = new System.Diagnostics.StackTrace(this.Exception, true);
var frame = st.GetFrame(0);

Затем необходимо прочитать файл, на который ссылается фрейм (обратите внимание, это будет работать, я думаю, только если файлы PDB доступны) и выяснить, какие строки вы хотите отобразить. Вот метод, если переданное исключение отправит обратно словарь с потенциальными строками. Затем вы можете сделать это так, как хотите.

public Dictionary<int, string> GetFileInfo(Exception ex, int linesBefore, int linesAfter)
    {
        Dictionary<int, string> sb = new Dictionary<int, string>();
        var st = new System.Diagnostics.StackTrace(ex, true);
        var frame = st.GetFrame(0);

        using (System.IO.StreamReader file = new System.IO.StreamReader(frame.GetFileName()))
        {
            if (file == null)
                return sb;

            int counter = 0;
            int line = frame.GetFileLineNumber();
            int lastline =  line + linesAfter;
            int firstline = line - linesBefore;

            while (!file.EndOfStream && counter < lastline)
            {
                string str = file.ReadLine();
                if (counter > firstline && !string.IsNullOrWhiteSpace(str))
                    sb.Add(counter, str);
                counter++;
            }
        }

        return sb;

    }
2 голосов
/ 30 июня 2010

йен,

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

If Not IsPostBack Then
    Dim ex As Exception = Server.GetLastError().GetBaseException()
    lblExceptionMessage.Text = ex.Message.ToString()
    lblStackTrace.Text = ex.StackTrace().Replace(System.Environment.NewLine, "<br />")
End If

Вы также можете использовать ex.TargetSite, чтобы получить только имя метода, вызвавшего исключение.

НТН,

Mike

1 голос
/ 24 июня 2010

Вам не нужно добавлять фильтр для захвата событий, просто обработайте Application_Error в global.asax.cs. Server.GetLastError () будет иметь информацию об исключении

Да, хм ... Нет. Ошибка, показанная в исходном вопросе, показывает ошибку синтаксического анализа / компиляции - эти ошибки происходят в конвейере HttpHandler для ASP.NET (фильтр ISAPI в более старых версиях IIS), т. Е. до , ваше приложение запускается, поэтому перед любым событий в Global.asax.

Хотя вы можете указать пользовательскую страницу ошибки (в web.config, machine.config или IIS метабазе), это могут быть только файлы HTML.

1) если вас интересуют только исключения, возникающие в вашем коде (т. Е. Ваш код компилируется, но затем выдается исключение), вы можете воспользоваться предложением Дэна сверху и обработать событие Application_Error в Glocal.asax.

Если вы хотите обрабатывать исключения ASP.NET (например, ошибки синтаксического анализа / компиляции, ошибки файлов конфигурации и т. Д.), Вам необходимо подключить (или заменить) ASP.NET HttpHandler.

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

Вы указали бы свой обработчик в файле web.config (или machine.config, если это глобальный обработчик).

В Интернете есть несколько хороших учебных пособий о том, как это сделать. Попробуйте начать здесь: http://msdn.microsoft.com/en-us/library/f3ff8w4a(VS.71).aspx

(основная проблема: чтобы отлавливать ошибки парсинга / компиляции, вам нужно написать обработчик / фильтр, который на уровень выше обработчик / фильтр ASP.NET (я считаю)).

Надеюсь, это поможет, Dourn.

0 голосов
/ 18 июня 2010

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

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

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