try/catch vs through 예외
이 코드 문장은 동등합니까?그들 사이에 어떤 차이가 있나요?
private void calculateArea() throws Exception {
....do something
}
private void calculateArea() {
try {
....do something
} catch (Exception e) {
showException(e);
}
}
아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.후인인 ( 인인인를를를 ) 、 첫iiiii (i내내내내내내내 ) ( 내내내내내내 ) 。showException
다시 던지지 않습니다.)
따라서 첫 번째 메서드를 호출하여 "do something"에 실패하면 발신자가 예외를 처리해야 합니다.'무엇을 하다'라는 말은 '무엇을 하다'라는 , '무엇을 하다'라는 은 '무엇을 하다'가 아니면 일반적으로 나쁜 입니다.showException
이 예외를 진정으로 처리하여 잘못된 부분을 수정하고, 일반적으로 다음 사항을 확인했습니다.calculateArea
목적을 달성했습니다.
첫 번째 방법을 호출할 때 두 가지 중 어느 쪽도 캐치하지 않으면 알 수 없기 때문에 이 사실을 알 수 있을 것입니다.Exception
자기 방식대로 던질 수도 있다고 선언할 수도 있습니다.
두 가지는 .Exception
는 거짓말입니다. 첫 번째는throws Exception
처리하지 않습니다.를 호출하는 는 이 를 처리할 필요가 있습니다.Exception
은 를 Exception
필요가 .단, 이 경우는 예외처리를 할 가 없습니다.showException()
그 자체는 다른 예외를 발생시키지 않습니다.
', '을 입니다.throws Exception
는 예외를 처리하기 위해 발신자 코드를 필요로 하지만 명시적으로 처리하는 버전에서는 그렇지 않습니다.
즉, 단순하게:
performCalculation();
vs. 예외 처리 부담을 발신자에게 이전:
try {
performCalculation();
catch (Exception e) {
// handle exception
}
네, 그들 사이에는 많은 차이가 있습니다.첫 번째 코드 블록에서는 예외를 발신자 코드에 전달합니다.두 번째 코드 블록에서는 사용자가 직접 처리합니다.어떤 방법이 옳은지는 전적으로 당신이 무엇을 하고 있는지에 달려 있다.경우에 따라서는, 코드를 사용해 예외를 처리하는 경우도 있습니다만(예를 들면, 파일을 찾을 수 없고, 파일을 새로 지정하거나 작성하거나 할 필요가 있는 경우 등), 콜 코드를 사용해 예외를 처리하는 경우도 있습니다.
일반적으로도 일반적인 예외는 잡고 싶지 않습니다. 대신 '어쩌다', '어쩌다', '어쩌다'와 같은 것만 게 거예요.FileNotFoundException
★★★★★★★★★★★★★★★★★」IOException
을 사용하다
스로우(throw)를 사용할 수 없는 특정 시나리오가 하나 있는데, 트라이캐치를 사용해야 합니다."오버라이드된 메서드는 부모 클래스가 던지는 것 이외의 추가 예외를 슬로우할 수 없습니다"라는 규칙이 있습니다.트라이캐치를 사용하여 처리해야 하는 추가 예외가 있는 경우.이 코드 조각에 대해 생각해 보십시오.단순한 기본 클래스가 있습니다.
package trycatchvsthrows;
public class Base {
public void show()
{
System.out.println("hello from base");
}
}
파생 클래스입니다.
package trycatchvsthrows;
public class Derived extends Base {
@Override
public void show() {
// TODO Auto-generated method stub
super.show();
Thread thread= new Thread();
thread.start();
try {
thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// thread.sleep(10);
// here we can not use public void show() throws InterruptedException
// not allowed
}
}
스레드를 호출해야 할 때.sleep() try-param을 강제로 사용합니다.여기서는 사용할 수 없습니다.
public void show() throws InterruptedException
재정의된 메서드는 추가 예외를 발생시킬 수 없기 때문입니다.
예외를 슬로우한 경우 하위 메서드(이를 재정의함)가 예외를 처리해야 합니다.
예:
class A{
public void myMethod() throws Exception{
//do something
}
}
A a=new A();
try{
a.myMethod();
}catch Exception(e){
//handle the exception
}
'동일'이라는 것은 행동을 말하는 것이라고 생각합니다.
함수의 동작은 다음과 같이 판별할 수 있습니다.
1) 반환값
2) 예외 발생
3) 부작용(히프, 파일 시스템 변경 등)
이 경우 첫 번째 메서드는 모든 예외를 전파하고 두 번째 메서드는 체크되지 않은 예외를 슬로우하고 체크되지 않은 예외 대부분을 삼키기 때문에 동작은 다릅니다.
단, "do something"이 예외를 발생시키지 않음을 보증하는 경우 동작은 동일합니다(첫 번째 버전에서는 컴파일러가 호출자에게 예외 처리를 요구합니다).
--편집--
API 설계의 관점에서 보면 계약서의 방식이 완전히 다릅니다.또한 클래스 예외를 던지는 것은 권장되지 않습니다.발신자가 예외를 보다 잘 처리할 수 있도록 보다 구체적인 것을 던져 봅니다.
발신자가 예외를 처리해 주었으면 하는 경우가 많습니다.예를 들어, 발신자가 다른 메서드를 호출하는 메서드를 호출하고, 각 메서드가 예외를 처리하는 것이 아니라 발신자에서 처리할 수 있다고 가정합니다.단, 그 방법이 실패했을 때 그 방법 중 하나를 사용하여 작업을 수행해야 합니다.
이 메서드의 호출자는 이 예외를 검출하거나 메서드시그니처에 재배열되었음을 선언해야 합니다.
private void calculateArea() throws Exception {
// Do something
}
다음 테스트 캐치블록의 예에서는이 메서드의 호출자는 이미 처리가 완료되었기 때문에 예외 처리에 대해 걱정할 필요가 없습니다.
private void calculateArea() {
try {
// Do something
} catch (Exception e) {
showException(e);
}
}
private void calculateArea() throws Exception {
....do something
}
이것에 의해 예외가 발생하므로, 발신자는 그 예외를 처리할 책임이 있지만, 발신자가 예외를 처리하지 않으면 jvm에 주어져 프로그램의 비정상적인 종료가 발생할 수 있습니다.
반면 두 번째 경우:
private void calculateArea() {
try {
....do something
} catch (Exception e) {
showException(e);
}
}
여기서 예외는 착신측에서 처리되므로 프로그램이 비정상적으로 종료될 가능성은 없습니다.
트라이캐치는 권장되는 접근법입니다.
IMO,
체크된 예외와 함께 주로 사용되는 키워드를 사용하여 컴파일러를 설득하지만 프로그램의 정상적인 종료를 보장하지는 않습니다.
예외 처리의 책임을 키워드 위임자에게 부여합니다.
발신자(JVM 또는 다른 메서드).선택된 예외에 대해서만 Strows 키워드가 필요합니다.체크되지 않은 예외에 대해서는 shrows 키워드는 사용되지 않습니다.
언급URL : https://stackoverflow.com/questions/3241571/try-catch-versus-throws-exception
'it-source' 카테고리의 다른 글
Java Map에서의 최대값과 관련된 키 검색 (0) | 2022.12.09 |
---|---|
스위치 대/소문자 문 오류: 대/소문자 표현은 상수 표현이어야 합니다. (0) | 2022.12.09 |
LIMIT는 MariaDB에서 동작하지 않는다 - 많은 시도를 했다 (0) | 2022.12.09 |
Naigent datetime.now()와 인식 datetime_end를 비교할 수 없습니다. (0) | 2022.12.09 |
Jackson 및 일반 유형 (0) | 2022.12.09 |