views:

836

answers:

6

Do you know any Open Source libraries for Delphi to serialize exceptions? I want to have a form “Exception has occurred”, so my users will be able to email error report to me. But apart from serializing exception manually, are there any open source libraries, that will serialize exception to XML or even flat file?

The absolute must-be: must work with Delphi 5…

+15  A: 

Not open source, but absolutely fabulous: madExcept

Uwe Raabe
Yes, I know madExcept, but for this project I do not have a budget for commercial libraries...
smok1
madExcept is free for non-commercial use.
DR
+2  A: 

MemCheck + Application.OnException

MemCheck can be found here: http://v.mahon.free.fr/pro/freeware/memcheck/
Stijn Sanders
And for Delphi>2006: http://code.google.com/p/delphi-memcheck/
Heinrich Ulbricht
+10  A: 

Jedi Code Library has a good free one, is open source and works with Delphi 5.

Lars Truijens
There is a writeup of how to use JCL Debug here: http://robstechcorner.blogspot.com/2009/04/finding-hard-to-reproduce-errors.html
jasonpenny
@jasonpenny - this link you provided is excellent!
smok1
+1  A: 

If all you want to do is to display a form indicating that an exception occured and offering the user the possibility to send an email with the exception report to you or save the exception to a file, then you are probably best off implementing this yourself. All you have to do is to implement the

Application.OnException

event. Any unhandled exceptions will be caught by this event handler. In the event handler just call a procedure

procedure HandleException;
begin
  ShowForm;
  SendReportEmail;
  SaveToFile;
end;

Also call this method whenever you catch an exception and want to show it to the user.

If you need more detailed exception information like stack traces etc. it's probably better to have a look at the proposed libraries.

Smasher
Yes, I want to have more details. The code you wrote - this is more less the same I am planning to do, but more details from Exception are wanted.
smok1
+3  A: 

User JclDebug and JclHookExcept. Free and very good. Here is a unit from my library to catch ALL exceptions that occur in an application. IT also makes a stack trace. I just add the unit in the uses part of the dpr and the unit does the rest.

{ $Cromis: lib/Cromis.Streams.pas,v 1.3 2008/04/13 17:09:35 ikacin Exp $ }
(*
 * This software is distributed under BSD license.
 *
 * Copyright (c) 2008 Iztok Kacin, Cromis ([email protected]).
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice, this
 *   list of conditions and the following disclaimer in the documentation and/or
 *   other materials provided with the distribution.
 * - Neither the name of the Iztok Kacin nor the names of its contributors may be
 *   used to endorse or promote products derived from this software without specific
 *   prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
*)
unit Cromis.Exceptions;

interface

uses
  Windows, SysUtils, Classes, JclDebug, JclHookExcept,

  // cromis units
  Cromis.SimpleLog;

var
  StackLogID: string;

implementation

procedure HookGlobalException(ExceptObj: TObject; ExceptAddr: Pointer; OSException: Boolean);
var
  StrList: TStringList;
begin
  StrList := TStringList.Create;
  try
    StrList.Add(Format('{ Original Exception - %s }', [Exception(ExceptObj).Message]));
    JclLastExceptStackListToStrings(StrList, False, True, True, False);
    StrList.Add('{ _______End of the exception stact trace block_______ }');
    StrList.Add(' ');

    // save the error with stack log to file
    SimpleLog.LogEvent(StackLogID, StrList.Text);
  finally
    StrList.Free;
  end;
end;

initialization
  Include(JclStackTrackingOptions, stTraceAllExceptions);
  Include(JclStackTrackingOptions, stRawMode);

  // Initialize Exception tracking
  JclStartExceptionTracking;

  JclAddExceptNotifier(HookGlobalException, npFirstChain);
  JclHookExceptions;

finalization
  JclUnhookExceptions;
  JclStopExceptionTracking;

end.

Just eliminate:

 // cromis units
 Cromis.SimpleLog;

var
  StackLogID: string;

I use this to automatically link it with my logging engine, so I get all exceptions logged complete with stack trace. If you need "Cromis.SimpleLog" say so and I can send it to you.

Runner
+1  A: 

I wonder that nobody mentioned EurekaLog. Absolutely great tool with lots of configuration possibilities.

Smasher
But is it free / OS?
smok1
I'm sorry I somehow managed to over-read this. At least Eureka comes with the full source and it's not that expensive either.
Smasher