예외 또는 오류 코드


12

우리는 (대부분의) 기본 클라이언트 (Windows, C ++)와 대화 할 웹 서비스 (SOAP, .Net)를 구축하고 있으며 클라이언트에게 오류를 전달하는 가장 좋은 방법이 무엇인지 궁금합니다 (예 : 로그인 서비스를 사용할 수없는 것처럼 SomethingBadHappened 또는 사용자를 찾을 수 없음) 클라이언트에 예외를 던지거나 위의 작업을 수행하기 위해 어떤 종류의 오류 코드 모델을 사용할지 결정할 수 없었습니다.

클라이언트 측에서 처리 할 때 선호하는 것 : 오류 코드 수신 또는 오류 이유가 포함 된 ServerFault 예외 처리?
1) 예외라고 생각하는 이유 : 서버 측 코드를 훨씬 더 균일하게 만들 수 있기 때문입니다.
2) 오류 코드를 생각하는 이유 : 클라이언트 측 관점에서 더 의미 가 있다고 생각 하기 때문입니다.

2) 사실이라면 예외보다 오류 코드를 원할 것입니다. 이 경우입니까?

또한 네이티브 클라이언트 대신 관리되는 클라이언트와 대화 할 경우 응답이 변경됩니까?


약간의 설명을 추가하기 만하면 : a) 여기서 모범 사례를 찾고 클라이언트 측에서 경험합니다 (클라이언트가 훨씬 복잡하고 클라이언트 코드를 더 간단하게 유지할 수 있다면 서버 측에서 물건을 처리하기 때문에) b) 클라이언트에는 많은 레거시 코드가 포함되어 있으며 C ++ 예외를 사용하거나 사용하지 못할 수 있습니다.
Wadhwa를 Amit

도움이 될 수 있습니다 www.codeproject.com/KB/cpp/cppexceptionsproetcontra.aspx
Gulshan

답변:


8

SOAP에는 결함 개념 이 있습니다. 예외를 서버 측 및 클라이언트 프록시에서 결함으로 변환하여 결함을 다시 예외로 다시 변환 할 수 있습니다. 이것은 WCF 및 Java 메트로 스택에서 현저하게 작동하며 기본 C ++ 클라이언트에 대해서는 언급 할 수 없습니다.

SOA 모범 사례와 관련하여 클라이언트가 특정 유형의 오류를 다르게 처리해야하는 경우에만 하나의 일반 결함과 몇 가지 특정 결함을 정의하십시오. 프로덕션 배포에서 예외 스택 추적을 클라이언트로 보내지 마십시오. 이론상 서버 추적은 클라이언트와 보안상의 이유로 아무런 의미가 없기 때문입니다. 서버에 전체 오류 및 스택 추적을 기록하고 결함이있는 로그에 대한 고유 한 참조를 보냅니다. WCF에서는 Enterprise Library의 Microsoft Exception Handling 블록을 사용하여 guid를 생성하고 예외를 SOAP 결함으로 변환합니다.

Microsoft 패턴 및 실습 에서 지침을 확인하십시오 .


고마워요. 페이지 내에서 더 구체적인 링크를 제공해 주시겠습니까?
Wadhwa를 Amit

또한 UserNotFound 등과 같은 비즈니스 레벨 오류는 예외로 처리되어야합니다.
Amit Wadhwa

과거 프로젝트에서는 SOAP의 코드 또는 결함에서 예외를 사용하여 합법적 / 예상 실패 모드를 전달하지 않았습니다. 우리는 오류 코드를 사용하여 클라이언트에게 맡겨서 무엇을할지 결정했습니다. 사용자를 찾을 수 없음은 실제로 오류 / 예외가 아니며, 아마도 상태 코드 여야합니다.
MrLane

4

최근에 Java 6 라이브러리를 사용하여 웹 서비스를 수행했는데 호출자에게 예외를 다시보고 할 수 있습니다 (자동으로 수행되는 방법을 조사하지 않았습니다).

클라이언트가 오류 보고서에서 스택 추적을 개발자에게 제공 할 수있는 기능은 매우 유용합니다 (대략적인 타임 스탬프를 얻은 다음 로그에서 로그에서 조회해야 함).

따라서 개발자의 관점에서 볼 때 예외를 사용하십시오.


1
이것이 dogfood 및 베타에서 유용 할 수 있다는 데 동의하지만 실제로 사용하는 경우 이벤트 로그 또는 로그 파일의 스택 추적을 분출하고 싶을 것입니다. )
Wadhwa를 Amit

2
@Amit, 이것에 대해 믿어 라 : 프로덕션 환경에서 스택 트레이스를 제공하는 상황이 발생하면 스택 트레이스를 원한다!

1
클라이언트 측에서 스택 추적의 이점은 무엇입니까? 클라이언트로 전달하기 전에 서버 측에 모든 예외를 확실히 기록합니다.
Wadhwa를 Amit

또한 UserNotFound 등과 같은 비즈니스 레벨 오류는 예외로 처리되어야합니다.
Amit Wadhwa

-2

웹 서비스 인 경우 서버에서 클라이언트가 포착 한 예외를 정확하게 발생시킬 수 없습니다. 인터페이스에서 서버는 기본적으로라는 문자열 인 경우에도 일종의 오류 코드를 반환해야합니다 An exception occurred. Type %s, message %s, stack trace %s.

클라이언트 측에서는 응답 읽기 코드가 응답을 검사하여 오류가 있는지 확인하고 클라이언트 측에서 예외를 발생시킬 수 있습니다. 적어도 예외 처리가 잘되는 언어에서는 그렇게하는 것이 좋습니다. 그러나 C ++에는 예외 처리가 잘되지 않으므로 가능한 한 C ++ 예외에서 멀리 떨어져있는 것이 좋습니다. 더 나은 언어를 사용할 수 없다면 오류 코드를 고수하십시오.


잡히지 않은 예외는 클라이언트에 ServerFault로 이동합니다
Amit Wadhwa

3
C ++ 또는 C ++ 예외에는 아무런 문제가 없습니다. 특정 프로젝트에 C ++ 이외의 언어를 사용해야하는 많은 이유가 있지만 예외 처리는 그 중 하나가 아닙니다.
KeithB

보안 모범 사례에 위배 될뿐 아니라 클라이언트가 서버의 스택 추적으로 정확히 무엇을해야합니까? 그것을 인쇄하여 보내십니까? 이메일로 보내시겠습니까? 윤활 지에 사용합니까?
JensG

@JensG이는 경우 웹 서비스 가 아닌 웹 사이트 , 클라이언트가 버그 리포트를 당신에게 이메일을 보내 전문적인 충분합니다.
메이슨 휠러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.