Groovy-예외 처리

응용 프로그램의 정상적인 흐름을 유지할 수 있도록 런타임 오류를 처리하려면 모든 프로그래밍 언어에서 예외 처리가 필요합니다.

예외는 일반적으로 응용 프로그램의 정상적인 흐름을 방해하므로 응용 프로그램에서 예외 처리를 사용해야하는 이유입니다.

예외는 크게 다음 범주로 분류됩니다.

  • Checked Exception − RuntimeException 및 Error를 제외하고 Throwable 클래스를 확장하는 클래스를 검사 예외 (예 : IOException, SQLException 등)라고합니다. 검사 된 예외는 컴파일시 검사됩니다.

한 가지 고전적인 경우는 FileNotFoundException입니다. E 드라이브의 파일에서 읽는 애플리케이션에 다음 코드가 있다고 가정합니다.

class Example {
   static void main(String[] args) {
      File file = new File("E://file.txt");
      FileReader fr = new FileReader(file);
   } 
}

파일 (file.txt)이 E 드라이브에 없으면 다음 예외가 발생합니다.

Caught : java.io.FileNotFoundException : E : \ file.txt (시스템이 지정된 파일을 찾을 수 없음).

java.io.FileNotFoundException : E : \ file.txt (시스템이 지정된 파일을 찾을 수 없음).

  • Unchecked Exception − RuntimeException을 확장하는 클래스는 확인되지 않은 예외 (예 : ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException 등)로 알려져 있습니다. 확인되지 않은 예외는 런타임에 확인되는 것이 아니라 컴파일시 확인되지 않습니다.

한 가지 고전적인 경우는 배열 길이보다 큰 배열의 인덱스에 액세스하려고 할 때 발생하는 ArrayIndexOutOfBoundsException입니다. 다음은 이러한 종류의 실수에 대한 전형적인 예입니다.

class Example {
   static void main(String[] args) {
      def arr = new int[3];
      arr[5] = 5;
   } 
}

위의 코드가 실행되면 다음 예외가 발생합니다.

포착 됨 : java.lang.ArrayIndexOutOfBoundsException : 5

java.lang.ArrayIndexOutOfBoundsException : 5

  • Error − OutOfMemoryError, VirtualMachineError, AssertionError 등과 같이 오류를 복구 할 수 없습니다.

이러한 오류는 프로그램이 복구 할 수 없으며 프로그램이 중단되는 원인이됩니다.

다음 다이어그램은 Groovy의 예외 계층 구조가 어떻게 구성되는지 보여줍니다. 모두 Java에 정의 된 계층 구조를 기반으로합니다.

예외 잡기

메소드는 다음 조합을 사용하여 예외를 포착합니다. trycatch키워드. 예외를 생성 할 수있는 코드 주위에 try / catch 블록이 배치됩니다.

try { 
   //Protected code 
} catch(ExceptionName e1) {
   //Catch block 
}

예외를 발생시킬 수있는 모든 코드는 보호 된 코드 블록에 배치됩니다.

catch 블록에서 애플리케이션이 예외에서 복구 할 수 있도록 예외를 처리하는 사용자 지정 코드를 작성할 수 있습니다.

배열의 크기보다 큰 인덱스 값을 가진 배열에 액세스하기 위해 위에서 본 유사한 코드의 예를 살펴 보겠습니다. 하지만 이번에는 try / catch 블록에 코드를 래핑하겠습니다.

class Example {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      } catch(Exception ex) {
         println("Catching the exception");
      }
		
      println("Let's move on after the exception");
   }
}

위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.

Catching the exception 
Let's move on after the exception

위 코드에서 try 블록에 잘못된 코드를 래핑합니다. catch 블록에서 우리는 예외를 잡아서 예외가 발생했다는 메시지를 출력합니다.

다중 캐치 블록

여러 유형의 예외를 처리하기 위해 여러 catch 블록을 가질 수 있습니다. 각 catch 블록에 대해 발생하는 예외 유형에 따라 적절히 처리하는 코드를 작성합니다.

위의 코드를 수정하여 ArrayIndexOutOfBoundsException을 구체적으로 포착합니다. 다음은 코드 조각입니다.

class Example {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      }catch(ArrayIndexOutOfBoundsException ex) {
         println("Catching the Array out of Bounds exception");
      }catch(Exception ex) {
         println("Catching the exception");
      }
		
      println("Let's move on after the exception");
   } 
}

위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.

Catching the Aray out of Bounds exception 
Let's move on after the exception

위의 코드에서 ArrayIndexOutOfBoundsException catch 블록이 예외의 기준을 의미하기 때문에 먼저 catch되는 것을 볼 수 있습니다.

마지막으로 차단

그만큼 finally블록은 try 블록 또는 catch 블록을 따릅니다. finally 코드 블록은 예외 발생에 관계없이 항상 실행됩니다.

finally 블록을 사용하면 보호 된 코드에서 어떤 일이 발생하더라도 실행하려는 모든 정리 유형 문을 실행할 수 있습니다. 이 블록의 구문은 다음과 같습니다.

try { 
   //Protected code 
} catch(ExceptionType1 e1) { 
   //Catch block 
} catch(ExceptionType2 e2) { 
   //Catch block 
} catch(ExceptionType3 e3) { 
   //Catch block 
} finally {
   //The finally block always executes. 
}

위의 코드를 수정하고 finally 코드 블록을 추가하겠습니다. 다음은 코드 조각입니다.

class Example {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      } catch(ArrayIndexOutOfBoundsException ex) {
         println("Catching the Array out of Bounds exception");
      }catch(Exception ex) {
         println("Catching the exception");
      } finally {
         println("The final block");
      }
		
      println("Let's move on after the exception");
   } 
}

위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.

Catching the Array out of Bounds exception 
The final block 
Let's move on after the exception

다음은 Groovy에서 사용할 수있는 예외 방법입니다-

공용 문자열 getMessage ()

발생한 예외에 대한 자세한 메시지를 반환합니다. 이 메시지는 Throwable 생성자에서 초기화됩니다.

공개 Throwable getCause ()

Throwable 객체가 나타내는 예외의 원인을 반환합니다.

공용 문자열 toString ()

getMessage ()의 결과와 연결된 클래스 이름을 반환합니다.

public void printStackTrace ()

스택 추적과 함께 toString ()의 결과를 오류 출력 스트림 인 System.err에 인쇄합니다.

공용 StackTraceElement [] getStackTrace ()

스택 추적의 각 요소를 포함하는 배열을 반환합니다. 인덱스 0의 요소는 호출 스택의 맨 위를 나타내고 배열의 마지막 요소는 호출 스택의 맨 아래에있는 메서드를 나타냅니다.

공용 Throwable fillInStackTrace ()

이 Throwable 개체의 스택 추적을 현재 스택 추적으로 채우고 스택 추적의 이전 정보에 추가합니다.

다음은 위에 주어진 방법 중 일부를 사용하는 코드 예제입니다.

class Example {
   static void main(String[] args) {
      try {
         def arr = new int[3];
         arr[5] = 5;
      }catch(ArrayIndexOutOfBoundsException ex) {
         println(ex.toString());
         println(ex.getMessage());
         println(ex.getStackTrace());  
      } catch(Exception ex) {
         println("Catching the exception");
      }finally {
         println("The final block");
      }
		
      println("Let's move on after the exception");
   } 
}

위의 프로그램을 실행하면 다음과 같은 결과가 나옵니다.

java.lang.ArrayIndexOutOfBoundsException: 5 
5 
[org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayPutAtMetaMethod$MyPojoMetaMet 
hodSite.call(IntegerArrayPutAtMetaMethod.java:75), 
org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) ,
org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) ,
Example.main(Sample:8), sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93),
groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325),
groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1443),
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:893),
groovy.lang.GroovyShell.runScriptOrMainOrTestOrRunnable(GroovyShell.java:287),
groovy.lang.GroovyShell.run(GroovyShell.java:524),
groovy.lang.GroovyShell.run(GroovyShell.java:513),
groovy.ui.GroovyMain.processOnce(GroovyMain.java:652),
groovy.ui.GroovyMain.run(GroovyMain.java:384),
groovy.ui.GroovyMain.process(GroovyMain.java:370),
groovy.ui.GroovyMain.processArgs(GroovyMain.java:129),
groovy.ui.GroovyMain.main(GroovyMain.java:109),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
org.codehaus.groovy.tools.GroovyStarter.rootLoader(GroovyStarter.java:109),
org.codehaus.groovy.tools.GroovyStarter.main(GroovyStarter.java:131),
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57),
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ,
java.lang.reflect.Method.invoke(Method.java:606),
com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)]
 
The final block 
Let's move on after the exception