2012-07-09 2 views
0

방금 ​​디버깅하는 동안 문제가 발생했습니다. kernel32.dll의 메서드를 사용하여 사용 가능한 RAM을 얻었지만 System.EngineExecutionException을 throw하지만 어쨌든 디버거가 중지됩니다. 예외로하고 계속하기를 거절합니다. 그런데 예외가 붙잡히지 않는 이유는 무엇입니까?왜 내 예외가 붙잡히지 않습니까?

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Management; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace StationController.Diagnose 
{ 
public class Memorystatus 
{ 
    public UInt32 Length; 
    public UInt32 MemoryLoad; 
    public UInt32 TotalPhys; 
    public UInt32 AvailPhys; 
    public UInt32 TotalPageFile; 
    public UInt32 AvailPageFile; 
    public UInt32 TotalVirtual; 
    public UInt32 AvailVirtual; 
} 
class Test 
{ 
    [DllImport("kernel32")] 
    private static extern void GlobalMemoryStatus(ref Memorystatus buf); 

    private static UInt32 GetFreeRAM() 
    { 
     try 
     { 
      Memorystatus MemStat=new Memorystatus(); 
      GlobalMemoryStatus(ref MemStat); 
     } 
     catch (System.ExecutionEngineException){ return 0; } 
     catch (System.Exception) { return 0; } 
     catch { return 0; } //I know kind of redundant 
     return sMemStat.AvailPhys; 
    } 
} 
} 

도구 - 옵션을> -> 이미 예외에 대한 이유를 고정

, MEMORYSTATUS하지 구조체 클래스이어야 선택 해제 "예외가 외부 응용 프로그램 도메인을 때 정지",이 질문에 대한 것입니다 try-catch 동작

+0

가능한 중복 [EngineExecutionException을 잡기] (http://stackoverflow.com/questions/9182387/catching-engineexecutionexception) –

답변

3

A System.EngineExecutionException은 무언가가 끔찍하게 잘못 될 때 CLR에 의해 throw되는 내부 .NET 오류입니다.

잡을 수 있습니까? 나는 그렇게 생각하지 않습니다 - 예 - 내가 생각하는이 레벨의 예외로 인해 관리되지 않는 메모리와 장난에

http://social.msdn.microsoft.com/Forums/eu/clr/thread/4425321d-b291-4a2a-899c-8266f16e26d8

그것은 아마 실행 계속에서 코드를 방지 당신의 KERNEL32.DLL 호출의

http://msdn.microsoft.com/en-us/library/system.executionengineexception.aspx

+0

나는 또한 내 .NET이에 손상있어 설치하는 것이 추가 할 수 있습니다 어떤 점 및 무작위로 WCF 호출을 할 때 이것을 던져 버릴 것입니다. - 10 분의 20 초마다 호출하면 w3wp.exe를 던져서 w3wp.exe를 제거합니다. 그래도 kernel32 호출 일 가능성이 높습니다. ** ** ** **이 될 수는 없습니다 – Charleh

+0

잘 맞았고 올바른 방향을 가리키고 있습니다 "CLR은 관리 코드가이를 catch 할 수있는 방식으로이 예외를 throw하지 않습니다." http://msdn.microsoft.com/en-us/library/system.executionengineexception%28v=vs.90%29.aspx 링크에서 가져 왔습니다. –

+0

@ChristianElsner : 네, 링크에 명시 적으로 언급했습니다 : _ "CLR이 일반적으로 치명적인 내부 오류로 인해 CLR을 계속 실행할 수없는 경우 CLR은 ** FailFast ** 메서드를 호출하고 두 번째 매개 변수로 ExecutionEngineException을 제공합니다."_ ['Environment.FailFast' 메서드] (http : //msdn.microsoft.com/en-us/library/ms131100%28v=vs.90%29.aspx) : _ "프로세스를 종료하지만 ** 활성 try-finally 블록이나 종료자를 실행하지 않습니다. ** "_ –