2016-06-08 3 views
7

현재 C 라이브러리를 Java로 포장하여 OO 프로그래밍 내에서 사용하고 작업하기가 더 쉽습니다. C 라이브러리는 데이터 조작을 위해 오류 코드 (int return value)와 Out-Parameter를 사용합니다. 필자는 반드시 오류 코드 팬이 아니기 때문에 내 라이브러리가 "성공"이외의 오류 코드를 감지하면 throw 할 수있는 사용자 정의 예외 클래스를 만들고 싶습니다.Java의 디자인이 좋지 않습니까?

유일한 단점은 모든 단일 메서드로 발생시킬 수있는 예외의 양이 매우 높다는 것입니다 ("C++ 라이브러리 함수"에서 "Device_Not_Connected"와 같은 일부 오류 코드가 반환 될 수 있음). Java로 프로그래밍 한 지 오래되었으므로 Java의 예외 상황이 무엇인지 모르겠습니다.

  1. 다른 예외를 많이 발생시키는 방법이 나쁜 디자인입니까?
  2. 예외를 처리해야합니까, 아니면 단순히 무시하는 방법이 있습니까?
  3. 예외를 무시할 수있는 경우 파이썬과 같이 (예를 들어 파이썬에서와 같이) 호출 트리를 버블 링합니까?
  4. 오류 코드 및 no-op 이외에 Java의 예외에 대한 대안이 있습니까?
+0

엄지 손가락의 좋은 일반적인 규칙은 호출자가 복구 할 수있는 조건에 대해 예외를 확인하는 것입니다. – nickb

답변

3

다른 예외를 많이 발생시키는 방법이 나쁜 디자인입니까?

사용하는 경우 분명히 없습니다! 예외는 기본적으로 메서드의 기술적 목적 범위를 벗어나는 가능한 반환 상태입니다. 예 : 메서드가 장치에서 값을 읽어야하는 경우 null 또는 반환 값을 사용하여 값을 반환해야합니다. 그러나 사용자 지정 DeviceNotConnectedException을 던져 단순히 returnung null 대신 반환 값을 읽을 수 없을 때 문제가 발생했다는 것을 나타내려면 100 % 권장 사항입니다. 그리고 10 가지가 잘못 될 수 있다면 10 가지 가능한 예외를 진술하는 것이 좋습니다.

예외를 처리해야합니까, 아니면 단순히 무시하는 방법이 있습니까?

예외를 catch하지 않으면이 메소드를 호출하는 모든 메소드에서 "public void myMethod() throw MyExcp {..}"와 같은 메소드를 선언해야합니다. 발신자 등. 당신이 main-method에 그것을 넘겨 주면 거기에서 처리되지 않습니다. 그것은 programm를 추락시킬 것입니다.

예외를 무시할 수있는 경우 파이썬과 같이 (예 : 파이썬에서와 같이) 호출 트리를 버블 링합니까?

위 참조.

오류 코드 및 no-ops 외에 Java의 예외가 있습니까?

나는 알고 있지만 전문가는 아닙니다.

+2

RuntimeException을 확장하면 메서드 시그니처에 명시 적으로 선언 할 필요가 없으며 호출 체인에서 자동으로 위쪽으로 거품이 생깁니다. IMO, RuntimeExceptions는 의미있는 방법으로 복구 될 수있는 예외를 제외하고는 검사 된 것보다 낫습니다. – marthursson

+0

@marthursson 그건 정확히 내가 무엇을 찾고 있었는지! –

+1

@marthursson 귀하의 의견 -> [ "결론은 다음과 같습니다 : 클라이언트가 예외로부터 복구 할 것으로 합리적으로 기대할 수 있다면 체크 된 예외로 만드십시오. 클라이언트가 예외로부터 복구 할 수없는 경우에는 체크하지 마십시오 예외. "] (https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html) –

2

IO (파일, 장치, 사용자 입력)에 연결된 문제가 발생하면 확실히 예외를 throw해야합니다. 모든 다른 오류 코드에 대해 다른 예외 클래스를 정의 할 필요는 없습니다.오류 코드의 취급이 매우 유사한 경우에는 가능하면, 당신은에 대한 검사 기능을 설정 등 잘못된 매개 변수에 연결되어있는 너무 많은 예외를 주변에 던지는 피해야한다

throw new IOException("Device not connected"); 

처럼 같은 예외를 사용할 수 있습니다 사용자 (예 : "containsKey")를 사용하면 이러한 작업을 "시도하고 잡을 필요가 없습니다.

+0

나는 미리 매개 변수를 검증 할 수 없었습니다. C 라이브러리가 통신하는 장치 인 경우 상태에 따라 다릅니다. 그것은 내가 본 가장 직관적 인 API가 아닙니다 :) –

1

Exception 클래스의 상속 계층 구조를 만들면 메소드 본문에서 throw하는 특정 예외의 수에 관계없이 메소드 서명이 일반 [Exception] 클래스를 거의 정의하지 않도록 할 수 있습니다.

호출자는 특정 예외 또는 일반적인 예외를 처리 할 수 ​​있습니다.

옵션 1 :

try { 
    myMethod(); 
} catch (MyGeneralException e) { 
    .... 
} 

옵션 2 :

try { 
    myMethod(); 
} catch (MySpecific1Exception e) { 
.... 
} catch (MySpecific2Exception e) { 
.... 
} 
+0

나는 다른 방향으로 만 움직 였다고 생각 했나요? 기본 예외 catch 절을 사용하여 파생 된 예외를 잡기? –

+1

예제를 추가했습니다. 나는 그것이 지금 분명하다는 것을 희망한다 – adranale

+0

가끔은 C++을 프로그래밍 한 후 잠시 동안 자바에 깊은 인상을 받았습니다! –

관련 문제