// See also: http://pastebin.com/XWpyDuw6 - "how to silently process exception"
// See also: http://pastebin.com/ACtr0r6S - "how to silently log exception"
// See also: http://pastebin.com/QiicyV2E - "how to log all (handled) exceptions"
// Option 1: use custom attributes
// Read more about this method: http://www.eurekalog.com/help/eurekalog/customizing_custom_attributes.php
// Option 1.A:
uses
EClasses,
ETypes;
type
[EurekaLogHandler(fhtRTL)]
ETestException = class(Exception);
procedure TForm1.Button1Click(Sender: TObject);
begin
// ETestException will be ignored by EurekaLog and
// it always will be handled by your application
// (as if EurekaLog would be disabled).
// In other words, this will be catched by standard
// Application.HandleException method.
// A default MessageBox will be shown.
raise ETestException.Create('Error Message');
end;
// Option 1.B:
uses
EClasses;
type
[EurekaLogExpected()]
ETestException = class(Exception);
procedure TForm1.Button1Click(Sender: TObject);
begin
// ETestException will be handled by EurekaLog.
// However, it would be considered as expected.
// In other words, this will be catched and shown by EurekaLog.
// But (EurekaLog) error dialog will lack
// "details", "send" and "restart" options.
raise ETestException.Create('Error Message');
end;
// Option 2: use filters
// Read more about this method: http://www.eurekalog.com/help/eurekalog/customizing_filters.php
// Usually you add exception filters at design-time here: http://www.eurekalog.com/help/eurekalog/exceptions_filters_page.php
// However, you can also create filter manually:
// Option 2.A:
uses
EModules;
CurrentEurekaLogOptions.ExceptionsFilters.AddIgnoredException(ETestException);
// ETestException will be ignored by EurekaLog and
// it always will be handled by your application
// (as if EurekaLog would be disabled).
raise ETestException.Create('Error Message');
// Option 2.B:
uses
EModules;
CurrentEurekaLogOptions.ExceptionsFilters.AddExpectedException(ETestException);
// ETestException will be handled by EurekaLog.
// However, it would be considered as expected.
// "details", "send" and "restart" options will not be shown.
raise ETestException.Create('Error Message');
// Option 2.C:
uses
EModules;
CurrentEurekaLogOptions.ExceptionsFilters.AddFullyIgnoredException(ETestException);
// ETestException will be handled by EurekaLog.
// However, it would be considered as ignored.
// No dialog, no bug report, no sending.
// Exception will act like EAbort.
raise ETestException.Create('Error Message');
// Option 2.D:
uses
EModules,
ETypes;
// Create custom filter:
var
Filter: TEurekaExceptionFilter;
begin
FillChar(Filter, SizeOf(Filter), 0);
Filter.Active := True;
Filter.ExceptionClassName := ETestException.ClassName;
Filter.ExceptionType := fetAll;
Filter.DialogType := edtUnchanged;
Filter.HandlerType := fhtRTL;
Filter.ActionType := fatUnchanged;
CurrentEurekaLogOptions.ExceptionsFilters.Add(Filter);
// ETestException will be ignored by EurekaLog and
// it always will be handled by your application
// (as if EurekaLog would be disabled).
raise ETestException.Create('Error Message');
end;
// Option 3: use event handlers
// Read more about this method: http://www.eurekalog.com/help/eurekalog/customizing_events.php
// Option 3.A:
uses
EEvents,
EException,
ETypes;
type
ETestException = class(Exception);
procedure TForm1.Button1Click(Sender: TObject);
begin
// ETestException will be ignored by EurekaLog and
// it always will be handled by your application
// (as if EurekaLog would be disabled).
raise ETestException.Create('Error Message');
end;
procedure ExceptionNotify(const ACustom: Pointer; AExceptionInfo: TEurekaExceptionInfo; var AHandle: Boolean; var ACallNextHandler: Boolean);
begin
// Specify EurekaLog to ignore ETestException
if AExceptionInfo.ExceptionClass = ETestException.ClassName then // <- this check matches ETestException only, but skips child classes
begin
AHandle := False;
ACallNextHandler := False;
Exit;
end;
end;
initialization
RegisterEventExceptionNotify(nil, ExceptionNotify);
end.
// Option 3.B:
uses
EEvents,
EException,
ETypes;
type
ETestException = class(Exception);
procedure TForm1.Button1Click(Sender: TObject);
begin
// ETestException will be handled by EurekaLog.
// However, it would be considered as expected.
// "details", "send" and "restart" options will not be shown.
raise ETestException.Create('Error Message');
end;
procedure ExceptionNotify(const ACustom: Pointer; AExceptionInfo: TEurekaExceptionInfo; var AHandle: Boolean; var ACallNextHandler: Boolean);
begin
// Mark exception as expected, but allow it to be handled by EurekaLog.
if (AExceptionInfo.ExceptionObject <> nil) and
(AExceptionInfo.ExceptionNative) and
(Exception(AExceptionInfo.ExceptionObject).InheritsFrom(ETestException)) and // <- this check matches ETestException and any of its child classes
(AExceptionInfo.ExceptionMessage = 'Error Message') then
begin
AExceptionInfo.ExpectedContext := -1;
Exit;
end;
end;
initialization
RegisterEventExceptionNotify(nil, ExceptionNotify);
end.
// Additional note:
// Here is a way to check additional properties of your exception:
procedure ExceptionNotify(const ACustom: Pointer; AExceptionInfo: TEurekaExceptionInfo; var AHandle: Boolean; var ACallNextHandler: Boolean);
begin
if (AExceptionInfo.ExceptionObject <> nil) and // check that there is exception object
(AExceptionInfo.ExceptionNative) and // check that it is a Delphi/Builder object
(Exception(AExceptionInfo.ExceptionObject).InheritsFrom(EOSError)) and // check exception class
(EOSError(AExceptionInfo.ExceptionObject).ErrorCode = ERROR_ACCESS_DENIED) and // check any additional exception properties
(AExceptionInfo.CallStack.Count > 0) and
(AExceptionInfo.CallStack[0].Location.UnitName = 'ServiceProvider') and
(AExceptionInfo.CallStack[0].Location.ProcedureName = 'Connect') then
begin
AExceptionInfo.ExpectedContext := -1;
Exit;
end;
end;
Comments
0 B
|👍
/👎
0 B
|👍
/👎