적어도 Mono's exception handling implementation의 설명에 따르면 예외가 발생하면 모든 x86 레지스터가 저장됩니다. 스택 포인터 (ESP), 프레임 포인터 (EBP), 명령어 포인터 (EIP) 및 예외 객체를 보유하는 레지스터 외에 다른 레지스터도 왜 저장됩니까? 왜 .NET에있을 때 전체 컨텍스트를 저장하면 throw 후에 즉시 실행을 계속할 수있는 메커니즘이 없습니까?.NET 예외 처리 중에 모든 레지스터가 저장되는 이유는 무엇입니까?
UPDATE :
자동 CLI가 생성되어 푸시 예외를 설명하는 예외 객체 계산 스택 상 :
EMCA는 예외 처리 12.3.2.4 개요 섹션에서는 다음과 같은 상태 필터 또는 catch 절의 입력시 첫 번째 항목으로.
필터 처리기를 제외한 예외 위치에서 실행을 다시 시작할 수 없습니다.
"필터 처리기를 제외하고"는 이전 문에 비추어 수행 할 수있는 방법을 모르겠습니다. 또한 endfilter opcode에 대한 설명에는 "다른 예외 처리기 검색 계속"또는 CIL opcode의 다른 블록을 실행하는 처리기를 실행하는 두 가지 결과 만 있습니다. "다시 시작"옵션이 없습니다. 따라서 사양에서이 불일치를 해석하면 .NET이 던지기 직후 실행을 계속할 수 없다는 것을 기본적으로 의미합니다. 어쩌면 그것은 어떤 시점에서 고려되었지만 완전히 실현되고 구현 된 적이 없을 수도 있습니다.
UPDATE 2 :
누군가가 어떤 필터 핸들러가 예외를 잡으려고의 opts하지 않는 경우 "다시 시작"단순히 일어날 수 있다고 지적했다. 그러나 throw에 대한 사양은 "throw 명령은 예외 객체를 스택에 던져 스택을 비 웁니다." 스택을 비우면 throw 문 바로 다음에 코드를 실행할 수 없으므로 스택에 무언가가 필요할 수 있습니다.
그냥 추측하지만 일부 디버깅 도구는 물건을 가지고? – kenny
아마 첫 번째 기회 대 두 번째 기회 예외 처리 및/또는 예외 필터와 관련이 있습니까? –