diff --git a/rtl/objpas/sysutils.pp b/rtl/objpas/sysutils.pp index 6f34704852..defd8b3cec 100644 --- a/rtl/objpas/sysutils.pp +++ b/rtl/objpas/sysutils.pp @@ -54,9 +54,8 @@ interface fhelpcontext : longint; public constructor create(const msg : string); -//!! No array of const yet. -// constructor createfmt(const msg; const args : array of const); - constructor createres(indent : longint); + constructor createfmt(const msg : string; const args : array of const); + constructor createres(ident : longint); { !!!! } property helpcontext : longint read fhelpcontext write fhelpcontext; property message : string read fmessage write fmessage; @@ -64,12 +63,29 @@ interface exceptclass = class of exception; - { math. exceptions } - einterror = class(exception); - edivbyzero = class(einterror); - erangeerror = class(einterror); - eintoverflow = class(einterror); - ematherror = class(exception); + { integer math exceptions } + EInterror = Class(Exception); + EDivByZero = Class(EIntError); + ERangeError = Class(EIntError); + EIntOverflow = Class(EIntError); + + { General math errors } + EMathError = Class(Exception); + EInvalidOp = Class(EMathError); + EZeroDivide = Class(EMathError); + EOverflow = Class(EMathError); + EUnderflow = Class(EMathError); + + { Run-time and I/O Errors } + EInOutError = class(Exception) + public + ErrorCode : Longint; + end; + EInvalidPointer = Class(Exception); + EOutOfMemory = Class(Exception); + + econverterror = class(exception); + { Read date & Time function declarations } @@ -89,6 +105,18 @@ interface implementation + + { Read message string definitions } + { + Add a language with IFDEF LANG_NAME + just befor the final ELSE. This way English will always be the default. + } + + {$IFDEF LANG_GERMAN} + {$i strg.inc} // Does not exist yet !! + {$ELSE} + {$i stre.inc} + {$ENDIF} { Read filename handling functions implementation } @@ -113,15 +141,16 @@ interface {!!!!!} end; -{ - constructor exception.createfmt(const msg; const args : array of const); + + constructor exception.createfmt(const msg : string; const args : array of const); begin inherited create; + fmessage:=Format(msg,args); end; -} - constructor exception.createres(indent : longint); + + constructor exception.createres(ident : longint); begin inherited create; @@ -148,6 +177,39 @@ begin end; +Var OutOfMemory : EOutOfMemory; + InValidPointer : EInvalidPointer; + + +Procedure RunErrorToExcept (ErrNo : Longint; Address : Pointer); + +Var E : Exception; + S : String; + +begin + Case Errno of + 1 : E:=OutOfMemory; + //!! ?? 2 is a 'file not found error' ?? + 2 : E:=InvalidPointer; + 3,4,5,100,101,106 : { I/O errors } + begin + Case Errno of + 3 : S:=SInvalidFileName; + 4 : S:=STooManyOpenFiles; + 5 : S:=SAccessDenied; + 100 : S:=SEndOfFile; + 101 : S:=SDiskFull; + 106 : S:=SInvalidInput; + end; + E:=EinOutError.Create (S); + EInoutError(E).ErrorCode:=IOresult; // Clears InOutRes !! + end; + else + E:=Exception.CreateFmt (SUnKnownRunTimeError,[Errno]); + end; + Raise E {at Address}; +end; + Procedure InitExceptions; { Must install uncaught exception handler (ExceptProc) @@ -155,7 +217,11 @@ Procedure InitExceptions; (e.g: SIGSEGV -> ESegFault or so.) } begin - ExceptProc:=@CatchUnhandledException; + ExceptProc:=@CatchUnhandledException; + // Create objects that may have problems when there is no memory. + OutOfMemory:=EOutOfMemory.Create(SOutOfMemory); + InvalidPointer:=EInvalidPointer.Create(SInvalidPointer); + ErrorProc:=@RunErrorToExcept; end; @@ -165,7 +231,10 @@ begin end. { $Log$ - Revision 1.10 1998-09-24 23:45:27 peter + Revision 1.11 1998-10-01 16:04:11 michael + + Added RTL error handling + + Revision 1.10 1998/09/24 23:45:27 peter * updated for auto objpas loading Revision 1.9 1998/09/24 16:13:49 michael