2012-03-23 3 views
1

여러 스레드를 실행하는 응용 프로그램이 있습니다. MadExcept를 사용하여 오류를 잡아 내고 디버깅합니다.MadExcept에서 치명적인 응용 프로그램 오류가 발생하지 않았습니다.

문제는 가끔 2-3 시간이 지나면 Windows에서 프로그램 닫기 대화 상자가 표시된다는 것입니다. 왜 MadExcept가 그 오류를 처리하지 않습니까?

+3

오류가 발생하여 Delphi의 예외 논리 외부에서 MadExcept가 catch 할 수없는 경우, MadExcept가 할 수있는 일은 아무것도 없습니다. 그러나 실제 오류에 대한 정보는 제공하지 않았습니다 ("프로그램 닫기 대화 상자"는 도움이되지 않습니다). ** if **라고 생각하는 대화가 닫 혔을지라도 (확실하지는 않습니다. Windows의 버전을 말하지 않았기 때문에) 오류보고 및 스택 추적을보고 볼 수있는 방법이 있습니다. 실제로 어떤 오류가 발생하고 어디에서 발생 했는가? 나는 여기에서 그것을 볼 수 없다, 그래서 나는 더 많은 도움이 될 수 없다. :) –

+0

Windows 7을 사용 중입니다. 더 이상 제공되는 정보가 없습니다. "프로그램에 오류 및 창이 있습니다 ..." – opc0de

+0

대화 상자에 오류 보고서를 볼 수있는 링크가 있습니다. 버그 리포트를 보낼 수 있도록 허용하면 MS에 보낼 텍스트 파일. 이 텍스트 파일에는 문제를 파악하는 데 도움이되는 호출 스택 및 기타 정보 (예외 코드, 레지스터 내용, 명령어 포인터 정보 등)가 있습니다. –

답변

1

스레드는 특별한 경우입니다. 스레드에서 예외가 발생하면 전역 처리기에서 처리하지 않고 대개 응용 프로그램을 종료합니다. madExcept를 사용하면 쉽게 해결할 수 있습니다. 그냥 예외를 잡아서 MadExcept에게 말하십시오. 그것은 일반적인 방법으로 로그인하고 스레드를 죽이지 않을 것입니다.

uses 
{$IFDEF MadExcept} 
madExcept, 
{$ENDIF} 


procedure TMyThread.Execute; 
begin 
    try 
     SetName; 
    // do your stuff 

    except 
    on errInfo : Exception do 
    begin 
{$IFDEF MadExcept} 
     HandleException(etNormal, errInfo); 
{$ENDIF} 
    end; 
    end; 
end; 

스레드가 시작될 때 스레드가 "RunningOK"속성을 true로 설정하고 예외를 false로 설정하면 예외가 발생합니다. 이 방법을 사용하면 내 제어 코드에서 문제가 발생했음을 알 수 있고 적절하게 처리 할 수 ​​있습니다 (다시 시작하거나 오류를보고하는 등)

+0

@David 죄송합니다, 따라야할까요? madExcept없이 컴파일하려면이 작업을 수행 할 수 있습니다. HandleException은 madExcept에만 해당되므로, 가지고 있지 않으면 분명히 무시해야합니다. 그러나 그것은 또한 일반적인 madExcept 방법으로 예외의 흔적을 얻을 수 있음을 의미합니다. – mj2008

+0

어쩌면 새로운 것이 겠지요. 예외적 인 세부 사항을 잡으려고 할 때 마티아스가 이렇게해야한다고 말했기 때문입니다. – mj2008

관련 문제