Groovy - обработка исключений

Обработка исключений требуется на любом языке программирования для обработки ошибок времени выполнения, чтобы можно было поддерживать нормальный поток приложения.

Исключение обычно нарушает нормальный поток приложения, поэтому нам нужно использовать обработку исключений в нашем приложении.

Исключения в целом подразделяются на следующие категории:

  • Checked Exception - Классы, расширяющие класс Throwable, за исключением RuntimeException и Error, известны как проверенные исключения, например ,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, будет вызвано следующее исключение.

Обнаружено: 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.

Выявление исключений

Метод перехватывает исключение, используя комбинацию try и catchключевые слова. Блок try / catch помещается вокруг кода, который может вызвать исключение.

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

Весь ваш код, который может вызвать исключение, помещается в блок Protected code.

В блоке 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 перехватывается первым, поскольку он означает критерии исключения.

Наконец блок

В finallyблок следует за блоком попытки или блоком перехвата. Блок кода 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.

public Throwable getCause ()

Возвращает причину исключения, представленную объектом Throwable.

общедоступная строка toString ()

Возвращает имя класса, связанного с результатом getMessage ()

public void printStackTrace ()

Печатает результат toString () вместе с трассировкой стека в System.err, поток вывода ошибок.

общедоступный StackTraceElement [] getStackTrace ()

Возвращает массив, содержащий каждый элемент трассировки стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод внизу стека вызовов.

public 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