2010-07-12 6 views
5

나는 간단한 try/catch 블록을홀수 시도/캐치 동작

try 
{ 
    // Open the connection 
    _connection.Open(); // [1] 
} 
catch(OracleException ex) // [2] 
{ 
    // Handle the exception 
    int x = ex.ErrorCode; 
} 

캐치가 실행되지 및 런타임 보고서 [1] 어떤 그냥 내 머리 회전을 만드는에서 'OracleException이 처리되지 않은했다'결코 있습니다. 분명히 관련 예외 유형에 대한 catch 문이 있습니다. 나는 [2]에서 정규화 된 유형 인 Oracle.DataAccess.Client.OracleException을 시도했지만 여전히 예외는 처리되지 않았습니다.

실제로 잡을 수있는 유일한 방법은 [2]에서 System.Exception을 잡는 것입니다. 이 이상한 행동을 일으키는 원인은 무엇입니까?

+0

'Exception'을 잡을 때'ex.GetType(). ToString()'을 쓸 때 출력되는 것은 무엇입니까? – ChaosPandion

+1

OracleException이 다른 유형의 Exception으로 래핑되는 것 같습니다. 전체 스택 추적은 무엇을 말합니까? – Chris

+0

Exception으로 잡히면 "Oracle.DataAccess.Client.OracleException"이 반환됩니다. – Matthew

답변

4

동적 Assembly.LoadFrom 또는 유사한 것을 사용 가능, 전혀 어셈블리를로드하고 있습니까? 그렇다면 유형이 다른 유형의로드 컨텍스트에 다른 유형의로드 된 상황이 발생할 수 있습니다. 그들이 유형 평등 검사 등 MSDN

  • 에서

    부하 상황 프로빙에 의해 발견 어셈블리 을 포함 일치하지 않도록 다른 컨텍스트에로드

    어셈블리는 서로 다른 정체성과 같은 유형을 제시 :에 런타임이 인 경우 호스트 어셈블리 저장소에서, GAC는 응용 프로그램 의 ApplicationBase 및 PrivateBinPath에서 호스팅됩니다. Load 메서드의 대부분 오버로드는이 컨텍스트에 어셈블리를로드합니다.

  • 은로드에서 컨텍스트는 사용자 않은 프로브가 검색 디렉토리에 포함되는 경로를 제공하는 어셈블리를 포함한다. LoadFrom, CreateInstanceFrom 및 ExecuteAssembly는 경로로로드하는 메서드의 예입니다.

은 물론 이것은 단지 추측, 그래서 내가 잘못 될 수 있습니다.

+0

당신과 나는 같은 이론을 가지고 있습니다. –

+0

이것은 훌륭한 제안이며 GAC를 점검 할 것입니다. 나는 워크 스테이션에 Oracle ODP 클라이언트의 두 가지 버전이 설치되어 있다는 것을 알고 있습니다. 나는 문제가 있다고 생각한다. – Matthew

1

더 일반적인 DbException을 잡을 수 있습니다.

try 
{ 
    // Open the connection 
    _connection.Open(); // [1] 
} 
catch(DbException ex) // [2] 
{ 
    // Handle the exception 
    int x = ex.ErrorCode; 
} 
2

Oracle.DataAccess.Client.OracleException 대신 Oracle.DataAccess.Client.OracleException을 던질 수 있습니다. 이상하게 들리 겠지만 주어진 AppDomain에 정확하게 같은 이름의 두 가지 유형을로드 할 수 있습니다.

이 시도

...

try 
{ 
    // Open the connection 
    _connection.Open(); // [1] 
} 
catch(Exception ex) // [2] 
{ 
    if (ex.GetType() == typeof(OracleException)) Debug.WriteLine("is match"); 
    else Debug.WriteLine ("is not match"); 

    // Handle the exception 
    int x = ex.ErrorCode; 
} 

또 다른 가능성은 예외가 포장되어 있다는 것입니다. OracleException이 포함 된 InvalidOperationException이 표시 될 수 있습니다.

마지막으로 오류는 try 블록 바로 다음 일 수 있습니다. 스택 추적을 잘못 읽었거나 스택 추적의 줄 번호가 잘못되었습니다. 둘 다 항상 나에게 일어난다.

+0

난 그냥 VB에서 '다른 사람'을 지적해야합니다. :) – ChaosPandion

+0

바보 같은 C#과 그 철자 검사의 부족. 나는 VB가 그런 것처럼 나를 위해 그런 것들을 돌봐주지 않는 이유를 모르겠다. VB의 컴파일러가 키워드를 어떻게 사용하는지 신경 쓰지 않기 때문에 이상하게 들릴 수도 있습니다. –

+0

저는 여러분과 Chris가 올바른 길에 있다고 생각합니다. 이전에 InvalidCastException 오류가 발생하여 Oracle.DataAccess.Client.OracleException을 Oracle.DataAccess.Client.OracleException으로 캐스팅 할 수 없다는 것을 알았습니다. 저에게 버전 문제가있는 것 같아요? – Matthew