Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка ошибок. Стандартное сообщение, там есть изображение куска кода, где ош. 
V
    Опции темы
AleXGray
Дата 10.12.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 18.1.2007

Репутация: нет
Всего: 1



Мне очень нравится стандартная страница ошибок ASP.NET.  Показывать в броузере всему миру я ее конечно не могу, но очень хотелось бы слать на мыло, при возникновении ошибки. 

Вот только я не знаю, как отловить некоторые параметры, которые там отображаются...
 В частности мне нужен тот кусок кода который там рисуется. 
Возможно ли его поймать?
Как мне сотворить такое чудо?
--------------------
В начале было Слово
PM MAIL   Вверх
Mymik
Дата 10.12.2007, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Цитата(AleXGray @  10.12.2007,  21:20 Найти цитируемый пост)
Возможно ли его поймать?
Как мне сотворить такое чудо? 

нет. такого сделать нельзя. Определяй кусок кода по состоянию стека(там показывается весь путь). 


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
tol05
Дата 11.12.2007, 00:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



Цитата(Mymik @  10.12.2007,  20:46 Найти цитируемый пост)
нет. такого сделать нельзя

Э-э! Товарищ Mymik! ПАчему такое нЭверие в наши силы, А? smile
А вот, например, товарищи из группы бобруйских программистов, говорят что можно... Или все-таки можно, товарищ Mymik?  smile 

Поскольку ASP.NET написана на .Net, то и мы можем на том же .Net попытаться сварганить что-нибудь. 
Ну про текст Exception-а говорить не интересно... С ним и так все ясно, обрабатывается он без проблем... А вот с остальным поробуем так:

AleXGray, тебе нужно cделать вот что:
1. В Global.asax перехватывать событие Error, вызывать server.GetLastError() - так ты получишь Exception.
2. В Exception-е напрямую (или через его свойство InnerException) добираешься до его свойства StackTrace (Exception - это ведь тоже класс, так что ж нам, только в дебаггере на него смотреть? Давай програмно с ним работать). 
3. Достаем бубен и неутомимо пляшем вокруг StackTrace, пока не вытянем из него то, что нам нужно, а именно: имя файла кода и строку с ошибкой
4. Ну а что делать, когда знаем имя файла и номер строки с ошибкой? Только одно - открыть его reader-ом и считать исходный код.

Вот пример. Кривой, как турецкий ятаган. Но сами понимаете,  ASP.NET писала группа бобруйских программистов, а я свой код пишу один  smile, у них пока не работаю, да и мысль пропасть в люой момент может...  smile  Так что, AleXGray, если отладишь все по-людски, можно смело ... ... .... писать им письма, например. smile

Код

//страница
public partial class Default2 : System.Web.UI.Page
{
  protected void Page_Load(object sender, EventArgs e)
  {
      //Имитируем сложную работу кода
      string s;
      for(int i = 0; i<5; i++)
      {
          s = "give me Exception!";
        StoreString(s);
      }
  }

    private void StoreString(string s)
    {
        int i = 10;
        int j = i/s.IndexOf("give");//Хотелось бы здесь получить DivideByZeroException
        Session.Add("number", j);
    }
}

Код

//Global.asax
<%@ Application Language="C#" %>
<%@ Import Namespace="System.IO" %>

<script runat="server">

   void Application_Error(object sender, EventArgs e) 
    {
        Exception ex = Server.GetLastError();
        string fileName;
        int errorIndex;        
        GetFileAndErrorLineNumber(ex, out fileName, out errorIndex);
        string errorSource = GetErrorSource(fileName, errorIndex);
    }

    private string GetErrorSource(string fileName, int errorIndex)
    {
        StreamReader reader = new StreamReader(fileName);
        for(int i = 0; i< errorIndex - 2; i++)
        {
            reader.ReadLine();
        }
        StringBuilder content = new StringBuilder();
        //берем строку с ошибкой, строку до нее и строку после (надо бы конечно проверять, есть ли
                //строки до и после, но опять же, это не принципиально сейчас)
        for(int i = 0; i< 3; i++)
        {
            content.AppendLine(reader.ReadLine());
        }
        reader.Dispose();
        return content.ToString();
    }

    private void GetFileAndErrorLineNumber(Exception ex, out string fileName, out int errorIndex)
    {
        while(ex.InnerException != null)
        {
            ex = ex.InnerException;
        }
        string[] stackTraceParts = ex.StackTrace.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
        string targetInformation = stackTraceParts[0].Substring(stackTraceParts[0].LastIndexOf("in ") + 3);//"in " - это 3 символа, они нам не нужны
        string[] sourceInformation = targetInformation.Split(new string[] { ":line " }, StringSplitOptions.RemoveEmptyEntries);
        fileName = sourceInformation[0];
        errorIndex = Int32.Parse(sourceInformation[1]);
    }
...

результат (errorSource)
Цитата

  int i = 10;
  int j = i/s.IndexOf("give");
  Session.Add("number", j);

5. Message Exception-а, исходный код и все, что еще нужно, берем и где-нибудь сохраняем (ну, в ASP таких мест хватает). 
6. В Global.asax (в Application_Error) пишешь 
Код

Server.ClearError();
Response.Redirect();//на свою страницу, которая будет отображать Exception "разноцветно", через таблицы
 также данные можно просто запросом передать (хоть через GET, хоть через POST, данных не много ведь).
Ну а если только письмом - то текст - в Email ... и прямо с Global.asax можно и отправить


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Mymik
Дата 11.12.2007, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



tol05, мдя... велики и могучи бобруйские программисты. Мой мозг до такой сложной задачи не опускался smile. Но у меня есть оправдание smile ибо я очень-очень часто пишу на asp.net 1.1, то я не могу использовать твой вариант. Потому что там нет файла кода ;) (точнее он не поставляется заказчику на сервер, так просто конечно отдается). В сборках распарсивать код как-то не сильно радует smile. Потому всегда ограничивался стеком... да и всегда хватало его, главное не ленится и смотреть что вообще произошло. И это очень помогает когда нужно понять, а вообще как мы туда попали smile

Так что бобруйск или не бобруйск, но вот если ты напишешь такую же штуку для asp.net 1.1 ну или для Web Application (там где файл кода не поставляется заказчику на сервер) тогда ставлю плюс без зазрения совести и икону истинного гуру над моим компьютером у меня в комнате smile (тут как раз окно, так что научусь гвозди в стекло забивать  smile )


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
tol05
Дата 11.12.2007, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



Mymik, при чем тут asp.net 1.1 или 2.0 ?

Приложение ASP.NET или поставляется с кодом, или поставляется без кода, хоть в 1.1, хоть в 2.0

Те страницы, о которых мы говорим, появляются на дев-машине и только если есть код. Если кода нет, то о чем можно говорить? Кому эти страницы нужны? Рефлектор что-ли с командной строки запускать чтобы из скомпилированного кода исходный код получить?

user posted image

Конечно, мы говорим только о ситуации, когда код есть и при работе сайта он динамически компилируется в Temporary ASP.NET Files

вот такой вот smile


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
AleXGray
Дата 11.12.2007, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 18.1.2007

Репутация: нет
Всего: 1



хм. Интересно.  smile ну так я пшел отлаживать... 

Правда мне еще отлаживать тот вариант обработки слишком большого файла что мне предложили... (он работает, но криво).

Но этот случай интереснее, так что файл подождет... smile 

Да, не перевелись еще бобруйские программисты... smile  Похоже даже если весь бобруйск вымрет, все равно останутся...
Плюс бы поставил, та експириенса не хватает smile 

--------------------
В начале было Слово
PM MAIL   Вверх
Mymik
Дата 11.12.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Цитата(tol05 @  11.12.2007,  15:31 Найти цитируемый пост)
Те страницы, о которых мы говорим, появляются на дев-машине и только если есть код. 

Дык я подумал, что автору нужно именно то что ты показал на рисунке... или я чего не догнал ??? а все остальное в стеке находится...

Цитата(tol05 @  11.12.2007,  15:31 Найти цитируемый пост)
Кому эти страницы нужны?

Ну вот у меня есть live-сервер, на нем расположен сайт написаный на Asp.net 1.1 из этого следует, что там не нужны cs файлы, там все данные хранятся в сборках и потому сайт с исходным кодом хранится только у девелоперов ну и где-нибудь в backup'ах у клиента. 
(Это к тому, что такие ситуации тоже бывают ;) )

Цитата(tol05 @  11.12.2007,  15:31 Найти цитируемый пост)
вот такой вот smile

Ну да, типа того.

P.S. до сих пор не могу понять зачем автору эта штука если в стеке гораздо больше информации  smile  smile  smile 




--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
alexburzak
  Дата 11.12.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 12.3.2007
Где: Hadera

Репутация: 1
Всего: 1



Цитата(Mymik @ 11.12.2007,  09:07)
...тогда ставлю плюс без зазрения совести ...

А мне мне мне мне мне можно плюс? А то как то не солидно я выгляжу на этом форуме.  smile 
На 1.1 в Глобальном файле я делал вот так:
Код

    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)

        'Dim MailClient As String
        'Try
        '    MailClient = Server.GetLastError.ToString
        '    Server.ClearError()
        'Catch ex As Exception
        '    'Sorry
        '    MailClient = "</h2>" & "Sorry . . . No GetLastError" & "</h2>"
        'End Try
        'SendToClient(1, "ыsldfjdsk[гав-мяу]logicpc.co.il", "Webmaster", MailClient)

    End Sub

Вот только столько мути приходит....  smile 
PM   Вверх
Mymik
Дата 11.12.2007, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1474
Регистрация: 12.5.2006
Где: Lamer-центер

Репутация: 50
Всего: 78



Цитата(alexburzak @  11.12.2007,  19:55 Найти цитируемый пост)
Вот только столько мути приходит....  smile

Это не муть, это очень полезная информация... я так много левых багов отловил, которые были до моего прихода на проект.


--------------------
ICQ ::            857-857
E-mail ::         mymik[at]inbox[dot]ru 
HomaPage ::  http://localhost/

:to_become_senile  :this
PM MAIL WWW ICQ   Вверх
tol05
Дата 11.12.2007, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 34
Всего: 170



Цитата(alexburzak @  11.12.2007,  18:55 Найти цитируемый пост)
А мне мне мне мне мне можно плюс? А то как то не солидно я выгляжу на этом форуме.

Что ты, alexburzak, ты отлично выглядишь!..  smile 

Просто вопрос был в другом... 
Цитата(AleXGray @  10.12.2007,  20:20 Найти цитируемый пост)
Вот только я не знаю, как отловить некоторые параметры, которые там отображаются...
 В частности мне нужен тот кусок кода который там рисуется. 
Возможно ли его поймать?
Как мне сотворить такое чудо? 

Не Exception по почте отправить, а покорить ASP.NET и заставить ее не только локально "желтые страницы смерти" (это у Эспозито такая фантазия) показывать, а вообще всем.
Т.е. не Exception.Message, а код файла, где была ошибка.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
AleXGray
Дата 13.12.2007, 03:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 18.1.2007

Репутация: нет
Всего: 1



Цитата(Mymik @ 11.12.2007,  19:38)

P.S. до сих пор не могу понять зачем автору эта штука если в стеке гораздо больше информации  smile  smile  smile

та от стека никто не отказывается... стек тоже влеплю... мне не жалко smile 
просто наглядней так... 

--------------------
В начале было Слово
PM MAIL   Вверх
Zakonnic
Дата 19.12.2007, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 25.4.2006

Репутация: 3
Всего: 6



Разбираюсь тут с отловом ошибок и наткнулся на свойство класса Exception - TargetSite.
Exception.TargetSite Property 
Gets the method that throws the current exception.
Код

public System.Reflection.MethodBase TargetSite { get; }


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

В МСДН только такая штука:
Код

// Example for the Exception.HelpLink, Exception.Source,
// Exception.StackTrace, and Exception.TargetSite properties.
using System;

namespace NDP_UE_CS
{
    // Derive an exception; the constructor sets the HelpLink and 
    // Source properties.
    class LogTableOverflowException : Exception
    {
        const string overflowMessage = "The log table has overflowed.";

        public LogTableOverflowException( 
            string auxMessage, Exception inner ) :
                base( String.Format( "{0} - {1}", 
                    overflowMessage, auxMessage ), inner )
        {
            this.HelpLink = "http://msdn.microsoft.com";
            this.Source = "Exception_Class_Samples";
        }
    }

    class LogTable
    {
        public LogTable( int numElements )
        {
            logArea = new string[ numElements ];
            elemInUse = 0;
        }

        protected string[ ] logArea;
        protected int       elemInUse;

        // The AddRecord method throws a derived exception if 
        // the array bounds exception is caught.
        public    int       AddRecord( string newRecord )
        {
            try
            {
                logArea[ elemInUse ] = newRecord;
                return elemInUse++;
            }
            catch( Exception e )
            {
                throw new LogTableOverflowException( 
                    String.Format( "Record \"{0}\" was not logged.", 
                        newRecord ), e );
            }
        }
    }

    class OverflowDemo 
    {
        // Create a log table and force an overflow.
        public static void Main() 
        {
            LogTable log = new LogTable( 4 );

            Console.WriteLine( 
                "This example of \n   Exception.Message, \n" +
                "   Exception.HelpLink, \n   Exception.Source, \n" +
                "   Exception.StackTrace, and \n   Exception." +
                "TargetSite \ngenerates the following output." );

            try
            {
                for( int count = 1; ; count++ )
                {
                    log.AddRecord( 
                        String.Format( 
                            "Log record number {0}", count ) );
                }
            }
            catch( Exception ex )
            {
                Console.WriteLine( "\nMessage ---\n{0}", ex.Message );
                Console.WriteLine( 
                    "\nHelpLink ---\n{0}", ex.HelpLink );
                Console.WriteLine( "\nSource ---\n{0}", ex.Source );
                Console.WriteLine( 
                    "\nStackTrace ---\n{0}", ex.StackTrace );
                Console.WriteLine( 
                    "\nTargetSite ---\n{0}", ex.TargetSite );
            }
        }
    }
}

/*
This example of
   Exception.Message,
   Exception.HelpLink,
   Exception.Source,
   Exception.StackTrace, and
   Exception.TargetSite
generates the following output.

Message ---
The log table has overflowed. - Record "Log record number 5" was not logged.

HelpLink ---
http://msdn.microsoft.com

Source ---
Exception_Class_Samples

StackTrace ---
   at NDP_UE_CS.LogTable.AddRecord(String newRecord)
   at NDP_UE_CS.OverflowDemo.Main()

TargetSite ---
Int32 AddRecord(System.String)
*/

--------------------
...и никогда не пишите в комментариях правду
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Любитель
Mymik
mr.DUDA

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Любитель, Mymik, mr.DUDA.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка под ASP.NET | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.