아마도 내 진짜 질문은 "이 기능은 Perl 학습에 적합합니까?"입니까? Should this Perl 6 CATCH block be able to change variables in the lexical scope?을 기반으로하면 가장 간단한 예가 간단한 예를 넘어서는 것 같습니다.언제 펄 6 예외를 다시 시작하겠습니까?
그런 질문에서 문제를 해결하기보다는 기능을 가지고 놀고 있었기 때문에 그 특정 문제에 대해 다른 방식으로 어리석은 또는 더 나은 것으로 보이는 무언가로 작업하고있었습니다.
경고의 문서화 된 사용이 특별한 종류의 예외 ("예외 제어")로되어있어 메시지를 받고, 원한다면 그것을 잡을 수 있지만, 무시할 수 있으며, 독자적으로 재개 할 수 있습니다 (비록 내가 이것은 Where should I catch a Perl 6 warning control exception?에서 다소 어리 석다.)
그 외에도 호출자가 호출 수신자가 호출 수신자의 범위 밖에서 오류를 처리 할 수있는 것에 대해 생각하고 있습니다. 예를 들어, 데이터베이스에 다시 연결하고, 누락 된 디렉터리를 수정하고, 호출 수신자가 책임지지 않는 기타 외부 리소스 문제를 해결합니다.
"현실 세계"프로그래밍 사람들은 실제로 문제를 처리하지 않는 경향이 있기 때문에 다른 언어에서 이런 종류의 일에 대해 읽는 데 조언은 주로 사용하지 않는 것이 좋습니다.
C# exception handler resume next에 대한 대답은 불량한 연습과 추악한 코드라고합니다. 나는 분명히 피 호출자에게 많은 코드를 숨기는 방법을 찾지 못했습니다.
초보자에게 권장할만한 방법이라고 확신하지는 않지만이 예제를 해킹했습니다. 프로그램이 시작될 때 PID 파일을 찾습니다. 하나를 찾으면 예외를 던집니다. 이 예외를 처리하면 다른 인스턴스가 아직 실행 중인지 여부가 검사되므로 다른 유형의 예외가 발생할 수 있습니다. 그리고 파일 IO 문제를 처리 할 수있는 방법이 있습니다. 그 트릭은 X::MyProgram::FoundSemaphore
이 다른 프로그램이 실행 중이 아닐지라도 (PID 파일을 남겨둔 채로) 다시 시작할 수 있다는 것입니다.
질문에는 중요하지 않지만 'BEGIN'은 컴파일 할 때 실행된다는 점에 유의하십시오. 모듈은 설치시 컴파일되므로 모듈에 배치 된이 코드는 의도 한대로 작동하지 않을 수 있습니다. 'INIT'는 프로그램 시작에있어 더 나은 선택이 될 것이며, 모듈의 경우에 잘 작동 할 것입니다. –
네, INIT가 더 좋아 보입니다. –