외부 명령 줄 유틸리티를 실행하고 표준 출력 (PNG 이미지)을 읽는 프로그램이 있습니다. 원래 테스트 중에 명령 줄 프로그램에서 이미지를 임시 파일을 만들고 프로그램에 파일을로드합니다. Exit 코드가 0이 아니면 예외를 던진 Process.Exited에 대한 처리기가 있습니다. 임시 이미지를로드하기 전에 WaitForExit을 호출하여 프로세스가 완료되었는지 확인했습니다. 예외가 발생하면 임시 이미지 파일을 읽는 코드에서 예외가 처리됩니다. 이제 오류가없는 경우 잘 작동하는 Process.Start를 호출 한 직후 이미지 파일을 만드는 호출을합니다. 외부 프로그램이 비정상적으로 종료되면 exit 핸들러가 던진 예외가 더 이상 내 코드에 걸리지 않습니다. 표준 출력을 읽기 전에 WaitForExit을 호출하면 프로그램이 중단됩니다. WaitForExit 호출하지 않고 종료 처리기에 의해 throw 된 예외를 잡을 수있는 방법이 있습니까?Process.Exited 처리기에서 예외를 throw하는 중
답변
당신이 명령 줄 유틸리티 프로그램처럼 나에게 소리가 제대로 종료되지 않습니다. 프로세스 창을 통해 잘못된 것을보고 있는지 확인해 보셨습니까?
표준 출력을 읽지 않는 것이 프로그램을 종료시키지 않는 것입니다 (출력을 지울 수있을 때까지 기다리는 중입니다). 따라서 표준 출력을 먼저 읽고 그 다음에 유틸리티를 기다려야합니다. 중지.
Process.Exited 처리기는 프로세스를 시작하는 함수와 별도의 컨텍스트에서 실행 중입니다. 이 두 가지 방법으로 문제를 해결할 수 있습니다.
- 프로세스를 시작한 후 루프를 작성하십시오. (프로세스의 핸들을 사용하여 루프 내에서 WaitOne (100)을 호출하십시오. 예외가 발생하면 핸들이 사라지고 프로세스가 완료된 것처럼 행동해야합니다. 예외가 발생하지 않으면 true를 나타냅니다 프로세스가 닫혔습니다.)
- 프로세스를 시작하기 전에 Reset()하는 ManualResetEvent를 만듭니다. 프로세스를 시작한 후 해당 이벤트에 대해 WaitOne()을 호출하십시오. Process.Exited 처리기에서 Set() 해당 이벤트 및 main 메서드를 계속합니다.
두 번째 제안을 구현하려고했습니다. 그것은 제대로 스레드를 차단하지만, try ... catch 블록에 의해 예외가 여전히 처리되지 않았습니다. 여기서 process.start와 waitone을 호출했습니다. 첫 번째 제안을 자세히 설명해 주시겠습니까? – pschorf
호출 코드에서 예외를 catch하려면 예외 자체를 공유 변수에 저장해야합니다. 그런 다음 Set() 이벤트는 주 스레드의 코드에 예외 변수를 확인하도록 지시합니다. null 인 경우 계속 진행하십시오. 그것이 null이 아니면 던져주세요. –
- 1. .NET의 생성자에서 예외를 throw하는 중
- 2. Excel AddIn 디자이너 코드에서 예외를 throw하는 중
- 3. statment 예외를 throw하는 방법?
- 4. CoerceValueCallback에서 예외를 throw하는 것이 적절합니까?
- 5. 인증 클래스가 throw하는 예외를 찾으십시오.
- 6. C에서 예외를 throw하는 방법은 무엇입니까?
- 7. enum 생성자에서 예외를 throw하는 방법?
- 8. ctor와 finalizer가 예외를 throw하는 C# 클래스의 모든 예외를 처리하려면 어떻게해야합니까?
- 9. Silverlight : BeginInvoke가 NotSupported 예외를 throw하는 이유는 무엇입니까?
- 10. Exception에서 상속받은 예외를 throw하는 방법은 무엇입니까?
- 11. 자바에서 컴파일 타임에 예외를 throw하는 방법
- 12. UIWebKit이 structuralComplexityContribution 예외를 throw하는 이유는 무엇입니까?
- 13. 가상 함수에서 예외를 throw하는 것이 좋습니다.
- 14. ProcessMessages가 C++ 예외를 throw하는 이유는 무엇입니까?
- 15. SQL Server가 예외를 계속 throw하는 이유는 무엇입니까?
- 16. 제거하는 동안 예외를 throw하는 설치를 어떻게 제거합니까?
- 17. Java 주 클래스에서 여러 예외를 throw하는 방법
- 18. 새로운 rhino mocks에서 예외를 throw하는 방법 3.5
- 19. C++ 클래스의 생성자에서 예외를 throw하는 것이 좋습니다.
- 20. ML에서 예외를 잡는 중
- 21. parseInt 및 parseLong이 UnsupportedOperationException을 throw하는 중
- 22. MySQL While 루프가 오류를 throw하는 중
- 23. ObservableCollection이 수정 될 때 예외를 throw하는 이유는 무엇입니까?
- 24. smtp 클라이언트를 사용하여 여러 수신자에게 전자 메일을 보내는 동안 예외를 throw하는 중
- 25. 예외를 throw하는 동안 C++ 템플릿 함수 오류가 발생했습니다.
- 26. 예외를 throw하는 기본 UI 스레드 코드를 실행할 수 있습니까?
- 27. 컬렉션을 열거하고 수정 한 다음 예외를 throw하는 선례는 무엇입니까?
- 28. URL을 가져올 때 None을 반환하거나 예외를 throw하는 것이 좋습니다.
- 29. 오류보고를 위해 예외를 throw하는 Antlr3 C 런타임은 무엇입니까
- 30. linq 예외를 throw하는 SQL 행을 찾을 수 없거나 변경되었습니다.
예기치 않게 종료됩니다 (Process.Exited의 처리기가 0이 아닌 종료 코드를보고 예외를 throw 함). 문제는 처리기에서 throw 된 예외를 catch 할 수 없다는 것입니다. – pschorf
@pschorf, 아 - 이해합니다. Process.Exited 처리기의 예외를 변수에 저장하고이를 사용할 수 있습니까? 예를 들어 프로세스가 종료 될 때까지 기다렸다가 throw하는 것일 수 있습니까? – Thies