sourcecode

스택 트레이스를 잃지 않고 Java에서 예외 재투입

copyscript 2022. 7. 31. 22:20
반응형

스택 트레이스를 잃지 않고 Java에서 예외 재투입

C# 에서는,throw;스택 트레이스를 유지하면서 예외를 재투입하려면 다음 명령을 사용합니다.

try
{
   ...
}
catch (Exception e)
{
   if (e is FooException)
     throw;
}

Java에는 이와 같은 것이 있습니까(원래 스택트레이스를 잃지 않는 것).

catch (WhateverException e) {
    throw e;
}

검출한 예외를 다시 던지기만 하면 됩니다(주변 메서드는 서명 등을 통해 이를 허용해야 합니다).이 예외는 원래 스택트레이스를 유지합니다

다음을 원합니다.

try
{
    ...
}
catch (FooException fe){
   throw fe;
}
catch (Exception e)
{
    // Note: don't catch all exceptions like this unless you know what you
    // are doing.
    ...
}

Exception as throwable을 원인 파라미터로 입력하여 예외를 다른 스택트레이스로 랩하고 원래 스택트레이스를 유지할 수도 있습니다.

try
{
   ...
}
catch (Exception e)
{
     throw new YourOwnException(e);
}

Java도 거의 비슷합니다.

try
{
   ...
}
catch (Exception e)
{
   if (e instanceof FooException)
     throw e;
}

Java에서는 잡은 예외를 무시하기만 하면 되기 때문에throw e뿐만 아니라throw. Java는 스택트레이스를 유지합니다

이와 같은 것

try 
{
  ...
}
catch (FooException e) 
{
  throw e;
}
catch (Exception e)
{
  ...
}
public int read(byte[] a) throws IOException {
    try {
        return in.read(a);
    } catch (final Throwable t) {
        /* can do something here, like  in=null;  */
        throw t;
    }
}

이 예는 메서드에 의해 전송되는 구체적인 예시입니다.IOException.그final수단ttry block에서 던져진 예외만 유지할 수 있습니다.추가 독서 자료는 이곳저곳에서 찾을 수 있다.

스택 트레이스는 캐치된 extection을 다른 예외로 랩(자세한 정보를 제공하기 위해)하거나 캐치된 extection을 재투입하기만 하면 제공됩니다.

try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }

저는 비슷한 상황을 겪고 있었습니다. 제 코드는 제가 다시 던지고 싶었던 많은 다른 예외를 잠재적으로 발생시킵니다.위에서 설명한 솔루션은 나에게 효과가 없었다. 왜냐하면 이클립스는 나에게 다음과 같이 말했다.throw e;처리되지 않은 예외로 이어지기 때문에 이렇게 했습니다.

try
{
...
} catch (NoSuchMethodException | SecurityException | IllegalAccessException e) {                    
    throw new RuntimeException(e.getClass().getName() + ": " + e.getMessage() + "\n" + e.getStackTrace().toString());
}

내게는 효과가 있었다...:)

언급URL : https://stackoverflow.com/questions/1097527/rethrowing-exceptions-in-java-without-losing-the-stack-trace

반응형