예외는 catch and finally 절에 던져집니다.
대학의 Java에 관한 질문에는 다음과 같은 코드 조각이 있었습니다.
class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}
public class C1 {
public static void main(String[] args) throws Exception {
try {
System.out.print(1);
q();
}
catch (Exception i) {
throw new MyExc2();
}
finally {
System.out.print(2);
throw new MyExc1();
}
}
static void q() throws Exception {
try {
throw new MyExc1();
}
catch (Exception y) {
}
finally {
System.out.print(3);
throw new Exception();
}
}
}
나는 그것의 산출물을 내놓으라고 요구받았다.라고 대답했습니다.13Exception in thread main MyExc2
, 은 '정답'입니다132Exception in thread main MyExc1
왜 그럴까?도대체 어디서 그런 짓을 하는 건지 이해가 안 돼MyExc2
가세요.
당신의 답변을 읽고 어떻게 생각해냈는지 살펴본 결과, '예외 진행 중'에는 '우선'이 있다고 생각하시는 것 같습니다.주의:
새로운 예외가 캐치블록 또는 최종적으로 그 블록 밖으로 전파되는 블록에 느려지면 새로운 예외가 외부로 전파됨에 따라 현재 예외가 중단(잊혀짐)됩니다.새로운 예외는 다른 예외와 마찬가지로 스택을 풀기 시작하고 현재 블록(캐치 또는 최종 블록)에서 중단되며 적용 가능한 모든 캐치가 적용되거나 최종적으로 블록이 실행됩니다.
적용 가능한 캐치 또는 최종 블록에는 다음이 포함됩니다.
새로운 예외가 캐치블록에 던져진 경우에도 새로운 예외는 해당 캐치의 최종 블록(있는 경우)의 영향을 받습니다.
실행을 .「 」 「 」 「 」 「 」를 때마다, 「 」 「 」 「 」를 클릭할 때마다throw
현재 예외 추적을 중지하고 새 예외 추적을 시작해야 합니다.
최종 블록의 예외가 캐치 블록의 예외보다 우선합니다.
이유 R에 의해 캐치 블록이 갑자기 종료되면 최종적으로 블록이 실행된다.그리고 선택할 수 있습니다.
최종적으로 블록이 정상적으로 완료되면 이유 R에 의해 try 문이 갑자기 완료됩니다.
이유 S로 인해 최종적으로 블록이 갑자기 완료된 경우 이유 S(및 이유 R이 폐기됨)로 인해 try 문이 갑자기 완료됩니다.
Wikipedia에서 최종적으로 다음과 같이 말하고 있습니다.
보다 일반적인 것은 예외 발생 여부에 관계없이 일반적으로 예외 처리 블록 본문 내에서 취득한 리소스를 해방하기 위해 실행되는 관련 절(최종 또는 보증)입니다.
네 프로그램을 해부해 보자.
try {
System.out.print(1);
q();
}
so,는,1
됩니다.q()
호출됩니다.인q()
예외가 느려집니다. 후 는 is음음음음음음음음음음음음 the the the the the the the에 의해 포착된다.Exception y
하지만 아무 소용이 없어요.그런 다음 최종 절이 실행되므로(필요하죠.3
화면에 인쇄됩니다.으로는)q()
final 절에도 예외가 있습니다.q()
는 부모).throws Exception
(Method Declaration) (Method Declaration)new Exception()
.catch ( Exception i )
,MyExc2
예외는 느려지지만(현재로서는 예외 스택에 추가), 최종적으로는main
블록이 먼저 실행됩니다.
그래서...
catch ( Exception i ) {
throw( new MyExc2() );
}
finally {
System.out.print(2);
throw( new MyExc1() );
}
마지막으로 절을...라고 한다.(기억해요, 방금 전에Exception i
MyExc2
의 본질은, 「」입니다.2
그리고 그 뒤에2
.MyExc1
예외가 느려집니다. MyExc1
에 의해 처리됩니다.public static void main(...)
★★★★★★ 。
출력:
"132MyExc1 스레드의 예외"
강사님 정답! :-)
기본적으로 try/catch 절에 finally가 있는 경우 (예외를 포착한 후 검출된 예외를 폐기)가 최종적으로 실행됩니다.
마지막으로 try/catch block 내의 어느 곳에서든 예외가 발생해도 절이 실행된다.
마지막입니다.main
발신자가 볼 수 있는 예외입니다.
, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」, 「 」를 확실히 하는 것이 합니다.finally
은 예외 삼킬 수 있기 에 아무 않습니다.try
A method
수 없다throw
이데올로기 때문에은 항상 으로 던져진 것을 것이다.exception
'아, 아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아.finally
에서 첫 예외가 q()
던지면 잡히고 마지막으로 던져진 블록 예외에 의해 삼켜집니다.
q() -> 투척new Exception
-> main
catch Exception
-> throw
new Exception
-> finally
을 던지다exception
에서 온것)catch
잃어버렸다'는죠).잃어버렸다'는 의미)
class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}
public class C1 {
public static void main(String[] args) throws Exception {
try {
System.out.print("TryA L1\n");
q();
System.out.print("TryB L1\n");
}
catch (Exception i) {
System.out.print("Catch L1\n");
}
finally {
System.out.print("Finally L1\n");
throw new MyExc1();
}
}
static void q() throws Exception {
try {
System.out.print("TryA L2\n");
q2();
System.out.print("TryB L2\n");
}
catch (Exception y) {
System.out.print("Catch L2\n");
throw new MyExc2();
}
finally {
System.out.print("Finally L2\n");
throw new Exception();
}
}
static void q2() throws Exception {
throw new MyExc1();
}
}
주문:
TryA L1
TryA L2
Catch L2
Finally L2
Catch L1
Finally L1
Exception in thread "main" MyExc1 at C1.main(C1.java:30)
가장 쉽게 생각할 수 있는 방법은 현재 예외를 유지하고 있는 전체 애플리케이션에 대한 변수가 글로벌하다고 가정하는 것입니다.
Exception currentException = null;
각 예외가 느려지면 "currentException"이 해당 예외로 설정됩니다.응용 프로그램이 종료되면 currentException이 != null이면 런타임에 오류가 보고됩니다.
또한 최종적으로 블록은 항상 메서드가 종료되기 전에 실행됩니다.그 후 코드 스니펫을 다음과 같이 다시 작성할 수 있습니다.
public class C1 {
public static void main(String [] argv) throws Exception {
try {
System.out.print(1);
q();
}
catch ( Exception i ) {
// <-- currentException = Exception, as thrown by q()'s finally block
throw( new MyExc2() ); // <-- currentException = MyExc2
}
finally {
// <-- currentException = MyExc2, thrown from main()'s catch block
System.out.print(2);
throw( new MyExc1() ); // <-- currentException = MyExc1
}
} // <-- At application exit, currentException = MyExc1, from main()'s finally block. Java now dumps that to the console.
static void q() throws Exception {
try {
throw( new MyExc1() ); // <-- currentException = MyExc1
}
catch( Exception y ) {
// <-- currentException = null, because the exception is caught and not rethrown
}
finally {
System.out.print(3);
throw( new Exception() ); // <-- currentException = Exception
}
}
}
응용 프로그램이 실행되는 순서는 다음과 같습니다.
main()
{
try
q()
{
try
catch
finally
}
catch
finally
}
가 끝날 까지 논리는 하다.13
. .러 、 예예 、 in thrown 、 。q()
catch (Exception i)
에main()
및 anew MyEx2()
던질 준비가 되었습니다.단, 예외를 설정하기 전에finally
먼저 블록을 실행해야 합니다.그러면 출력은132
그리고.finally
다른 예외를 발생시키도록 요청한다.new MyEx1()
.
방법은 두 개 이상 던질 수 없기 때문에Exception
, 그것은 항상 최신 정보를 던집니다.Exception
바꿔 말하면, 둘 다catch
그리고.finally
블록이 던지려고 하다Exception
, 그 다음에Exception
어획량은 삼켜지고 예외만 있다finally
던져질 것이다.
이 예외, 예외, 예외, 예외.MyEx2
'''가 됩니다.MyEx1
는 이 of of of에서 제외됩니다.main()
않게 해, 은 「JVM」이 됩니다.132Exception in thread main MyExc1
질적 a가 에는 in in in in in in infinally
in a a a a try/catch
절, 절, 절finally
는 예외를 검출한 후에 실행되지만 검출된 예외를 슬로우하기 전에 마지막으로 마지막으로 예외만 슬로우됩니다.
try and catch 후에 최종 블록이 실행되어 항상 실행된다는 것은 잘 알려져 있습니다.하지만 조금 까다롭다는 것을 알 수 있듯이, 때때로 아래의 코드 조각들을 보면 반환과 던지기 문장이 항상 우리가 기대하는 순서대로 수행되지 않는다는 것을 알 수 있습니다.
건배.
/////////////Return dont always return///////
try{
return "In Try";
}
finally{
return "In Finally";
}
////////////////////////////////////////////
////////////////////////////////////////////
while(true) {
try {
return "In try";
}
finally{
break;
}
}
return "Out of try";
///////////////////////////////////////////
///////////////////////////////////////////////////
while (true) {
try {
return "In try";
}
finally {
continue;
}
}
//////////////////////////////////////////////////
/////////////////Throw dont always throw/////////
try {
throw new RuntimeException();
}
finally {
return "Ouuuups no throw!";
}
//////////////////////////////////////////////////
될 것 요.finally
★★★★
- 「1」을 인쇄합니다.
finally
q
33 」3 인3 인인 인다finally
main
인쇄하다
이것으로 문제가 해결된다고 생각합니다.
boolean allOk = false;
try{
q();
allOk = true;
} finally {
try {
is.close();
} catch (Exception e) {
if(allOk) {
throw new SomeException(e);
}
}
}
이러한 상황을 처리하기 위해, 즉 최종 차단에 의해 발생한 예외를 처리합니다.최종 블록을 트라이 블록으로 둘러쌀 수 있습니다.다음 python의 예를 참조하십시오.
try:
fh = open("testfile", "w")
try:
fh.write("This is my test file for exception handling!!")
finally:
print "Going to close the file"
fh.close()
except IOError:
print "Error: can\'t find file or read data"
언급URL : https://stackoverflow.com/questions/3779285/exception-thrown-in-catch-and-finally-clause
'programing' 카테고리의 다른 글
Vue.js에서 사용자 지정 구성 요소 태그 이름을 유지하는 방법 (0) | 2022.08.30 |
---|---|
Vuex Store에서 네스트된 어레이를 관리하고 컴포넌트를 전달하는 방법 (0) | 2022.08.30 |
스택 트레이스를 인쇄하기 위해 내부 프로그램에서 gdb를 호출하는 가장 좋은 방법? (0) | 2022.08.29 |
C에서 0을 선두로 하는 인쇄 (0) | 2022.08.29 |
size_t의 올바른 printf 형식 지정자: %zu 또는 %Iu? (0) | 2022.08.29 |