Java IDL:예외 - xrath.com 에서 번역됨

# 예외

CORBA 에는 다음의 2 종류의 예외가 있습니다. OMG 로 완전하게 규정된 표준 시스템 예외와 어플리케이션 프로그래머가 정의하는 사용자 예외의 2 개입니다. CORBA 의 예외는 Java 의 예외 객체와는 다소 다릅니다만, 그 차이의 대부분은 IDL 로부터 Java 에의 매핑시에 해결됩니다.

여기에서는, 이하의 항목에 대해 설명합니다.

- CORBA 의 예외와 Java 의 예외의 차이
- 시스템 예외
  - 시스템 예외의 구조
  - 마이너 코드
  - 완료 상태
- 사용자 예외
- 마이너 코드의 의미

## CORBA 의 예외와 Java 의 예외의 차이

IDL 로 예외를 지정할 때는, 키워드 raises 를 사용합니다. 이것은, Java 로 throws 를 지정하는 것과 같습니다. IDL 로 이 예외 키워드를 사용하는 경우는, 사용자 정의 예외를 작성하게 됩니다. 표준 시스템 예외에서는, 이러한 지정을 할 필요는 없고, 또, 이러한 지정을 할 수 없습니다.

## 시스템 예외

CORBA 에서는, 일련의 표준 시스템 예외가 정의되고 있습니다. 표준 시스템 예외는, 다음과 같은 시스템 관련의 에러 상태의 발생을 지모아 두어 일반적으로 ORB 라이브러리에 의해 생성됩니다.

- 자원의 부족이나 기동의 실패 등, 서버측의 시스템 예외
- 객체와의 통신이 절단 된, 호스트가 정지하고 있는, ORB demon (orbd)와 접속할 수 없는 등, 통신 관련의 시스템 예외
- 오퍼랜드의 형태가 무효, 요구가 보내지기 전 또는 결과가 반환된 뒤에 하등의 문제가 발생했다는 등, 클라이언트측의 시스템 예외

시스템 예외는, 불려 간 모든 IDL 오퍼레이션에 대해서 throw 될 가능성이 있습니다. 인터페이스의 설계자는, 인터페이스내의 오퍼레이션으로 시스템 예외를 throw 할 수 있는 것 같은 스펙으로 할 필요는 없습니다. 이 처리는 자동으로 행해집니다.

오퍼레이션의 구현이 얼마나 단순했다고 해도 , 다른 프로세스 (대부분이 다른 머신상의 프로세스)인 클라이언트로부터 오퍼레이션 호출을 하는 것으로, 모든 에러가 발생할 가능성이 있기 (위해)때문에, 이 스펙은 타당하다라고 말할 수 있습니다.

따라서, CORBA 클라이언트에서는, CORBA 의 시스템 예외를 항상 캐치 하도록(듯이) 해야 합니다. 또, CORBA 의 시스템 예외는 `java.lang.RuntimeException` 의 하위 클래스가 되기 (위해)때문에, 캐치 해야 할 시스템 예외의 통지를 Java 컴파일러에 맡길 수 없습니다.

### 시스템 예외의 구조

CORBA 의 시스템 예외는, 모두 다음과 같은 같은 구조를 하고 있습니다.

    exception <SystemExceptionName> { // descriptive of error
        unsigned long minor ;          // more detail about error
        CompletionStatus completed ;   // yes, no, maybe
    }

시스템 예외는,`java.lang.RuntimeException` 로부터 `org.omg.CORBA.SystemException` 까지의 클래스의 subtype입니다.

    java.lang.Exception
     |
     +--java.lang.RuntimeException
         |
         +--org.omg.CORBA.SystemException
             |
             +--BAD_PARAM
             |
             +--//etc.

### 마이너 코드

CORBA 의 모든 시스템 예외에는, 예외 발생의 원인이 된 에러에 관한 부가적 정보를 제공하는 마이너 코드 필드가 설치되고 있습니다. 마이너 코드의 의미는 OMG 에서는 규정되지 않고, 각 ORB 벤더가, 그 구현 마다 적절한 마이너 코드를 규정하게 되어 있습니다. Java ORB 에 의해 규정되고 있는 마이너 코드의 의미에 대해서는,「마이너 코드의 의미」를 참조해 주세요.

### 완료 상태

CORBA 의 모든 시스템 예외에는, 예외를 throw 한 오퍼레이션 상태를 나타내는 완료 상태 필드가 있습니다. 완료 상태 코드에는, 다음의 3 개가 있습니다.

COMPLETED_YES
  객체의 구현은, 예외가 일어나기 전에 처리를 완료했다
COMPLETED_NO
  객체의 구현은, 예외가 일어나기 전에 불려 가지 않았다
COMPLETED_MAYBE
  호출 상태가 불명

## 사용자 예외

CORBA 의 사용자 예외는,`java.lang.Exception` 으로부터 `org.omg.CORBA.UserException` 까지의 클래스의 subtype입니다.

    java.lang.Exception
     |
     +--org.omg.CORBA.UserException
          |
          +-- Stocks.BadSymbol
          |
          +--//etc.

각 사용자 정의 예외는, 생성된 Java 예외 클래스의 IDL 의 결과 중(안)에서 규정합니다. 사용자 정의 예외는, 모두 프로그래머가 정의해, 구현합니다.

## 마이너 코드의 의미

모든 시스템 예외에는, CORBA 벤더가 예외 발생의 원인에 관한 부가적 정보를 제공할 수 있도록(듯이),minor 라고 하는 필드가 설치되고 있습니다. OMG 의 표준 마이너 코드 예외 (OMGVMCID)의 리스트에 대해서는, OMG 의 문서 (http://www.omg.org/docs/omg/03-01-04.txt )를 참조해 주세요.

자주(잘) 조우하는 Sun 의 마이너 코드 예외에는, 다음과 같은 것이 있습니다.

- COMM_FAILURE/201. 「vmcid: SUN 마이너 코드: 201」은, 「CONNECT_FAILURE」를 의미합니다. 이것은,`java.net.SocketException` 가 원인으로 생기는 일이 있어, 일반적으로은 `BindException`,`ConnectException`, 또는 `NoRouteToHostException` 의 머지않아인가입니다.

  다음과 같은 점을 확인할 필요가 있습니다.

  - 네임 서비스는 실행되고 있을까. 실행되어 있지 않은 경우는,「네임 서비스의 기동과 정지」의 설명에 따라,ORDB 네임 서비스를 개시합니다.
  - 네임 서비스에 대해서 `-ORBInitialHost` 및 `-ORBInitialPort` 의 값이 올바르게 설정되어 있을까. 어떻게 설정하면(자) 좋은가 모르는 경우는,「네임 서비스의 기동과 정지」를 참조해 주세요.
  - 클라이언트 어플리케이션과 서버 어플리케이션은, 네임 서비스가 실행되고 있는 포트 번호 (필요한 경우는, 한층 더 머신명)를 인식하고 있을까. 이것을 실시하는 방법에 대해서는,「네임 서비스의 기동과 정지」를 참조해 주세요.

- COMM_FAILURE/208. 「vmcid: SUN 마이너 코드: 208」은, 「CONNECTION ABORT」를 의미합니다. 이것은 일반적으로, 접속이 끊어진 것을 나타냅니다.

- COMM_FAILURE/209. 「vmcid: SUN 마이너 코드: 209」는, 「CREATE_LISTENER_FAILED: `Unable to create the listener thread on the specific port. Either the post is taken or there was an error creating the daemon thread`」를 의미합니다. 이것은 일반적으로, 네임 서비스를 실행하려고 한 포트가 다른 프로세스에 의해 사용중인 것을 나타내고 있습니다. Solaris 상에서 실행하고 있는 경우에는, 이 포트로 다른 프로세스가 실행중인가 어떤가를 조사하기 위해서(때문에), 단말 prompt로 다음의 커멘드를 실행합니다.

      netstat | grep port_number

- COMM_FAILURE/204. 「vmcid: SUN 마이너 코드: 204」는, 「SERVANT_NOT_FOUND」를 의미합니다. 이것이 throw 되는 유일한 장소는,`corba.INSSubcontract.getINSReference` 입니다.

- MARSHAL/217. vmcid: SUN 마이너 코드: 217」은, 클라이언트가 GIOP 1.0 으로 `wchar` 나 `wstring` 의 어느쪽이든을 송신하려고 한 것을 의미합니다. 이것은, 스펙으로 허가되고 있지 않습니다.

- MARSHAL/202. 「vmcid: SUN 마이너 코드: 202」는, `org.omg.CORBA.Object` 로부터 파생한 객체를 정렬화하려고 했지만, 그 특정의 인스턴스가 ORB 에 접속되어 있지 않은 것을 의미합니다. POA 를 사용하는 경우는, 우선 객체를 POA 에 등록할 필요가 있습니다. 객체를 POA 에 등록하는 방법의 상세한 것에 대하여는,POA 의 문서 또는튜토리얼을 참조해 주세요.

- BAD_PARAM/201. 「vmcid: SUN 마이너 코드: 201」은, 「NULL_PARAM」를 의미합니다. 이 예외는, 많은 경우,`write_string` 나 `write_octet_array` 등의 `write` 메소드에 대해서 Java 의 `null` 를 건네주었을 때에 발생합니다. Java 메소드의 결과로서 Java 의 `null` 를 돌려줄 수 없습니다.

- org.omg.CORBA.INTERNAL. 「vmcid: SUN 마이너 코드: 208」은, 「`Unable to determine local hostname using InetAddress.getLocalHost(). getHostName()`」를 의미합니다.

  ORB 는,`InetAddress.getLocalHost(). getHostName()` 를 사용해, 참조의 검색이나 바인드를 위해서(때문에) 네임 서비스에의 참조를 작성합니다. 또, 서버측에서 `InetAddress.getLocalHost(). getHostName()` 를 사용해, 닷 단락 10 진수와 포트의 편성은 아니고, 서버의 이름과 포트를 포함한 원격 객체 참조 (즉 IOR)를 작성합니다.

  `getHostName` 의 호출을 회피하려면 , 다음과 같은 프로퍼티을 설정합니다 (설정 방법법에 대해서는,「네임 서비스의 기동과 정지」를 참조).

  - ORB 가 서버로서 기능하고 있는 경우는,`com.sun.CORBA.ORBServerHost` 에 서버의 DNS 명 또는 닷 단락 10 진수 주소를 설정
  - `com.sun.CORBA.ORBInitialHost` 에, 네임서버-의 DNS 명 또는 닷 단락 10 진수 주소를 설정

  주: 이러한 프로퍼티은 독자적인 것으로, 삭제 또는 변경되는 일이 있습니다.

상기의 설명으로는 불충분한 경우, 또는 상기 이외의 Sun 마이너 코드에 조우했을 경우에는,http://forum.java.sun.com 의 개발자 포럼에 메세지를 투고해 주세요.

마이너 코드의 의미에 대해 정보를 요구하는 경우에는, 다음의 정보를 지 편하다 차이.

- 클라이언트 및 서버를 실행하고 있는 플랫폼 (Solaris, Linux, Win32 등)
- 사용하고 있는 Java SE 의 버젼 (1.5. 0_01 등)
- 스택 트레이스 전체
- 다른 벤더의 네임 서비스 또는 ORB 를 사용하고 있는 경우는, 제품의 벤더와 버젼에 관한 정보

홈

Copyright © 1996-2004 Sun Microsystems, Inc., 2550 Garcia Ave., Mtn.View, CA. 94043-1100 USA., All rights reserved.