c++ DLL에서 예외 오류 잡는법
C++에서 사용하는 DLL에서 오류가 나면 try catch에서 잡히지 않는문제를 해결 하였다.
AccessViolationException 예외는 네이티브 쪽에서 메모리 접근 위반을 했을 때 발생 하는 예외 이다.
할당되지 않은 메모리 또는 코드가 접근 권을 갖지 않는 메모리를 읽거나 쓰기를 시도하면 네이티브 코드(언 세이프 코드)에서 액세스 위반이 발생한다.
그러나 보통 System.Exception의 파생 클래스인 셈이라서 catch에서 이 예외를 포착할 것으로 생각하지만 애플리케이션은 이 예외를 잡지 못해서 이상 종료를 한다.
.NET Framework 3.5 이전에는 AccessViolationException을 catch 할 수 있었지만 .NET Framework 4 이후에서는 못하도록 바뀌었다.
이 예외를 잡고 싶다면 두 가지 방법을 하나를 하면 된다.
1. HandleProcessCorruptedStateExceptionsAttribute
AccessViolationException을 catch 하고 싶은 메소드에HandleProcessCorruptedStateExceptionsAttribute를 붙여서 잡을 수 있다.
[HandleProcessCorruptedStateExceptions]
void DoSomething()
{
try {
AccessViolationException를 발생하는();
} catch(AccessViolationException e) {
//---포착 가능
}
}
2.legacyCorruptedStateExceptionsPolicy
하위 호환성 때문에 기존(.NET Framework 3.5 이전)처럼 애플리케이션 전체에서 포착할 수 있도록 하고 싶은 경우. 구성 파일(*. config)에<legacyCorruptedStateExceptionsPolicy>요소를 넣어서 해결할 수 있다.
<configuration>
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>
</configuration>