Jaka jest różnica pomiędzy
try {
fooBar();
} finally {
barFoo();
}
i
try {
fooBar();
} catch(Throwable throwable) {
barFoo(throwable); // Does something with throwable, logs it, or handles it.
}
Druga wersja podoba mi się bardziej, ponieważ daje mi dostęp do Throwable. Czy jest jakaś logiczna różnica lub preferowana konwencja między tymi dwiema odmianami?
Czy istnieje również sposób uzyskania dostępu do wyjątku z klauzuli last?
java
try-catch
try-finally
Vijay Kotari
źródło
źródło
Throwable
odfinally
bloku, ponieważ nie może byćThrowable
.To nie są odmiany, to zasadniczo różne rzeczy.
finally
jest wykonywany zawsze ,catch
tylko gdy wystąpi wyjątek.źródło
Wreszcie bloki catch są zupełnie inne:
Więc
try { //some code } catch (ExceptionA) { // Only gets executed if ExceptionA // was thrown in try block } catch (ExceptionB) { // Only executed if ExceptionB was thrown in try // and not handled by first catch block }
różni się od
try { //some code } finally { // Gets executed whether or not // an exception was thrown in try block }
znacząco.
Jeśli zdefiniujesz blok try, musisz zdefiniować
Więc poniższy kod również byłby prawidłowy:
try { //some code } catch (ExceptionA) { // Only gets executed if // ExceptionA was thrown in try block } catch (ExceptionB) { // Only executed if ExceptionB was thrown in // try and not handled by first catch block } //even more catch blocks finally { // Gets executed whether or not an // exception was thrown in try block }
źródło
try
służy do uruchamiania metody, która może zgłosić wyjątekcatch
służy do „przechwytywania” zatrzymania tego wyjątkufinally
jest używany do czyszczenia potrzebnego po wykryciu tego wyjątku lub nietry{ myObject.riskyMethod(); // run a method that may throw an exception } catch(Exception ex){ myLogger.log(ex.Message); // "catch" stop that exception } finally{ myObject = null; // clean up needed from that exception being caught }
źródło
try { statements; } catch (exceptionType1 e1) { // one or multiple statements; } catch (exceptionType2 e2) { statements; } ... } finally { // one or none statements; }
Bez względu na to, co blok Final jest zawsze wykonywany, więc generalnie blok Final jest używany, gdy masz sesje, połączenia z bazą danych lub pliki lub gniazda są otwarte, kod zamykający te połączenia zostanie umieszczony. Ma to na celu upewnienie się, że w aplikacji nie wystąpią wycieki pamięci ani żadne inne problemy.
źródło
Wreszcie bloki catch są zupełnie inne:
W bloku catch możesz odpowiedzieć na zgłoszony wyjątek. Ten blok jest wykonywany tylko wtedy, gdy istnieje nieobsługiwany wyjątek, a typ jest zgodny z jedną lub jest podklasą tego określonego w parametrze bloku catch. Ostatecznie będzie zawsze wykonywany po blokach try and catch, niezależnie od tego, czy wystąpił wyjątek, czy nie.
źródło
W Moich badaniach blok Ostatecznie jest zawsze wykonywany i jest głównie „używany do zamykania wszelkich otwartych połączeń” oraz do niszczenia czegoś, co działa niepotrzebnie.
źródło
Generalnie, gdy używamy jakichkolwiek zasobów, takich jak strumienie, połączenia itp., Musimy je jawnie zamknąć, używając funkcji last block. W podanym niżej programie odczytujemy dane z pliku za pomocą FileReadera i zamykamy go za pomocą bloku final.
import java.io.File; import java.io.FileReader; import java.io.IOException; public class ReadData_Demo { public static void main(String args[]){ FileReader fr=null; try{ File file=new File("file.txt"); fr = new FileReader(file); char [] a = new char[50]; fr.read(a); // reads the content to the array for(char c : a) System.out.print(c); //prints the characters one by one }catch(IOException e){ e.printStackTrace(); } finally{ try{ fr.close(); }catch(IOException ex){ ex.printStackTrace(); } } } }
Może inni faceci tacy jak ja szukali czegoś takiego.
Informacje z tej strony tutpoint
źródło
Ostatecznie blok jest zawsze wykonywany. Blok przechwytywania jest wykonywany tylko wtedy, gdy zostanie przechwycony wyjątek zgodny z parametrem bloków.
źródło
Nawet w pierwszej formie można było to zalogować w metodzie wywołującej. Nie ma więc dużej przewagi, chyba że chcesz wykonać specjalne czynności właśnie tam.
źródło
Try block będzie zawierał instrukcje, które mają wywołać wyjątek. Blok catch będzie przechowywać odwołanie wyrzucone z bloku try, a wymagane komunikaty są generowane z bloku catch. Ostatecznie blok jest również używany do zamykania używanych zasobów, takich jak zamykanie io, zamykanie pliku, zamykanie dB .. W Javie -9 pojawiło się rozszerzenie zasobu try-with, w którym zasoby są zadeklarowane poza try..in ulepszone try z zasobem blok catch jest obowiązkowe
źródło