Delphi Handle Exception

2837 단어 exception
Delphi에서 오류를 처리할 때 가장 자주 사용하는 방법은try입니다.except ….end. 예를 들면 다음과 같습니다.
try

    raise Exception.Create('Error Message');

  except

    on e:Exception do

    begin

      ShowMessage(e.Message);

    end;



  end;

 
지금 말하고자 하는 것은 또 다른 방법이다.
var

  ExceptionObj : TObject;

begin

  { Simulate an access violation. }

  try

    System.Error(reAccessViolation);

  except

    ExceptionObj := ExceptObject;

    if ExceptionObj <> nil then

    begin

      MessageDlg(ExceptionObj.ToString, mtError, [mbOK], 0);

    end;

  end;

end;

위의 코드는 ExceptObject라는 대상을 사용했습니다. 이 대상은 System 단원에서 정의된 것으로 현재 처리 중인 오류 대상을 되돌려줍니다. 오류가 발생하지 않으면 그 값은 nil입니다.오류 변수 (try.except에 정의된) 에 접근할 수 없을 때 ExceptObject는 오류 처리 코드가 함수를 호출하여 오류 처리를 할 때 유용하게 보입니다.
주의해야 할 것은 오류 처리가 끝난 후에 ExceptionObject가 nil로 되돌아올 것입니다.사용할 수 있는 함수 중 하나는 AcquireExceptionObject입니다.이 함수는 현재 except 대상의 바늘을 되돌려줍니다. 이 함수의 역할은 현재 except 대상이 방출되는 것을 방지하기 위해서입니다.AcquireExceptionObject는 참조 수를 통해 작동합니다.
 
다음은 델피의 오류 처리 코드입니다.
procedure TForm2.btIOErrorClick(Sender: TObject);

var

  ExceptionObj : TObject;

begin

  {

  Try to write something onto the console--it will raise an

  exception.

  }

  try

  WriteLn('This will generate an error because there is no' +

          ' console attached!');

  except

    ExceptionObj := ExceptObject;

    if ExceptionObj = nil then

      MessageDlg('No exception', mtError, [mbOK], 0)

    else

    begin

      MessageDlg(ExceptionObj.ToString, mtError, [mbOK], 0);

    end;

  end;

end;

 

{$OVERFLOWCHECKS ON}

{$OPTIMIZATION OFF}

{$HINTS OFF}

procedure TForm2.btOverflowErrClick(Sender: TObject);

var

  b : Cardinal;

  ExceptionPtr : Pointer;

begin

  {

  Simulate an overflow. Note: Enable the overflow

  checking and disable optimizations, because the Delphi

  compiler will not compile this code otherwise.

  }

  ExceptionPtr := nil;

  try

    b := $FFFFFFFF;

    b := b * b;

  except

    ExceptionPtr := AcquireExceptionObject;

  end;

 

  // Check exception.

  if ExceptionPtr = nil then

    MessageDlg('No exception', mtError, [mbOK], 0)

  else

  begin

    MessageDlg(TObject(ExceptionPtr).ToString, mtError, [mbOK], 0);

    ReleaseExceptionObject;

  end;

end;

{$HINTS ON}

{$OPTIMIZATION ON}

{$OVERFLOWCHECKS OFF}

 

procedure TForm2.btRuntimeErrorClick(Sender: TObject);

var

 

  ExceptionObj : TObject;

  begin

  { Simulate an access violation. }

  try

    System.Error(reAccessViolation);

  except

    ExceptionObj := ExceptObject;

    if ExceptionObj = nil then

      MessageDlg('No exception', mtError, [mbOK], 0)

    else

    begin

      MessageDlg(ExceptionObj.ToString, mtError, [mbOK], 0);

    end;

  end;

end;

 

좋은 웹페이지 즐겨찾기