문제

F# 대화식 통역사를 사용할 때 이상한 행동을 관찰하고 있습니다.

다음 코드 실행 :

let getType1 = Type.GetType("namespace.does.not.exist, doesntexistlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",false);;
let getType2 = Type.GetType("namespace.does.not.exist, doesntexistlib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",false);;

FSI가 ThrowOnerror 매개 변수가 False로 설정되어 있어도 fileloadexception을 잡습니다. 처음으로 예외가 발생합니다.

일반 프로그램에서 동일한 코드를 실행하면 (대화식이 아닌) gettype = null이 예상되는 동작이 발생합니다.

fsi.exe는 모든 예외에서 중지됩니까? 이러한 예외를 무시하도록 FSI를 설정할 수 있습니까?

도움이 되었습니까?

해결책

스택 추적을 기반으로 FSI가 AppDomain의 어셈블리 해상도에 연결되는 것처럼 보입니다. 불행히도 FSI는 어셈블리를 해결할 수 없을 때 예외 자체를 던지고 있습니다. 이것은 프레임 워크 코드에 의해 생성되지 않기 때문에 throwOnError 매개 변수는 존중되지 않습니다. FSI의 예외는 위쪽으로 전파되고 최상위 수준에서 잡히는 것입니다. 나에게 이것은 FSI의 버그처럼 보이지만 AppDomain의 어셈블리 해상도 프로세스에서 사용 가능한 후크는 FSI에 던져야 할시기를 결정하기에 충분한 정보를 제공하지 않을 수 있습니다.

편집하다 - 소스 파일 fsi.fs (소스/fsharp/fsi 디렉토리의 f# 배포에 포함)를 살펴보면이 핸들러가 연결되는 위치를 확인할 수 있습니다 (무서운 이름이 지정된 이름에 있습니다. MagicAssemblyResolution 기준 치수). FSI는 어셈블리가 #r 지침을 찾을 수는 있지만, 일이 잘못되고있는 곳에서 한 눈에 말하거나 왜 유효하지 않은 어셈블리를 해결하려고 시도 할 때 예외가 최상위 수준으로 던져지지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top