пятница, 9 января 2009 г.

TestExceptions

Эх если бы объединить все вкусности всех языков программирования и всех платформ...
К примеру меня зацепило наличие у .NET'овского эксепшена наличие свойства StackTrace.
Маленький пример на C#
Эх если бы объединить все вкусности всех языков программирования и всех платформ...
К примеру меня зацепило наличие у .NET'овского эксепшена наличие свойства StackTrace.
Маленький пример на C#
using System;
using System.Collections.Generic;
using System.Text;

namespace TestExceptions
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                throw new Exception();
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception Addr: " + e.StackTrace);
            }
            Console.ReadKey();
        }
    }
}
И в качестве адресса я получу сборку, класс, метод и строку, в котором было исключение. Круто?

Win32 увы врядли так сможет:(

Мальнький примерчик на языке Delphi (я позаимствовал из книги Марку Канту и немного переделал):

program TestExceptions;

{$APPTYPE CONSOLE}

uses SysUtils;

type
  ECustomException = class (Exception)
protected
  procedure RaisingException(P: PExceptionRecord); override;
end;

procedure ECustomException.RaisingException(P: PExceptionRecord);
begin
  Writeln('Exception Addr: ' + IntToHex (
  Integer(P.ExceptionAddress), 8));
  // standard processing
  inherited;
end;

begin
  raise ECustomException.Create('A message');
  Readln;
end.
И в качестве результата получим адресс 0040B186h, что мягко говоря не удобно, так как прийдется запускать дебагер и медитировать на ассемблер.

P.S. Было бы неплохо приделать к блогу подсветку и нормальное форматирование синтаксиса, а то как-то не красиво выходит

5 комментариев:

Анонимный комментирует...

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

and85 комментирует...

да можно, но в .NET это уже реализовано:)
самый простой способ сделать подобное в винде, как мне кажеться, это использовать проверку Assert, но возрастает сложность кода и все на перед все равно не продумаешь:(

Анонимный комментирует...

И в качестве адресса я получу сборку, класс, метод и строку, в котором было исключение. Круто?

Win32 увы врядли так сможет:(


Может вообще-то :)))))

Unknown комментирует...

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

and85 комментирует...

Artem, спасибо - не знал. Нужно будет попробовать.