문제

서버와 TCP 소켓 통신을 캡슐화하는 클래스가 있습니다. 서버로 전송 된 각 명령 메시지에 대해 서버는 응답 코드를 항상 포함하는 응답 메시지를 다시 보냅니다 (OK, FAIL). 내 클래스를 사용하여 각 명령은 동기화 또는 비동기를 실행할 수 있습니다.

기본적으로 발생할 수있는 두 가지 유형의 예외가 있습니다 : 분리 또는 다른 회복 불가능한 오류로 인한 "결함"및 "보내기 버퍼가 전체"와 같은 예기치 않은 예외입니다. 결함이 발생하면 연결이 다시 설정 될 때까지 명령이 계속되거나 다시 시도 될 수 없습니다. 실패 응답이 있거나 예외가 발생하면 명령을 다시 시도 할 수 있습니다 ...

따라서 지금 내 동기 명령 메소드는 다음 값을 가질 수있는 열거를 반환합니다. OK, FAIL, FAULT. 예외가 발생하면 단순히 호출 스레드 (동기화 명령)로 올라갑니다. Async 명령의 경우 결과 속성 열거 값은 추가 값을 포함 할 수 있습니다. 확인, 실패, 결함 또는 예외 및 콜백은 명령 개체의 예외 속성을 통해 실제 예외 객체에 액세스 할 수 있습니다.

이 전략에 대해 어떻게 생각하십니까? 나는 동기화 명령에 대해 전혀 예외를 제기하지 않고 내부적으로 예외를 기록하고 대신 4 번째 열거 값을 반환하고 싶어합니다. 결과 코드는 전혀 코드를 제외하고 모든 경우, 심지어 결함이 있습니까?

감사.

도움이 되었습니까?

해결책

나는 당신의 전략이 기본적으로 건전하다고 생각합니다.

예외의 목적은 예외적 인 조건을 다루는 것입니다. 문제의 원천에 가까울수록 좋습니다.

귀하의 경우, 귀하의 전략은 "지금은 작동하지 않았습니다. 다시 시도합시다"는 것 같습니다. 나는 실제로 예외를 제기 할 이유가 없다.

닫힌 소켓을 다루는 것이 코드에서 완전히 다른 흐름이 필요한 것이라면 예외가 의미가있을 수 있습니다. 설명에서 실제로는 그렇지 않습니다.

예외에 대한 나의 철학은 그들이 실제로 다룰 수없는 탁월한 조건을위한 것이어야한다는 것입니다. 닫힌 소켓? 흠 ... 인터넷은 우리 집에서 몇 번이나 내려갑니다 ...

다른 팁

내 선호는 방법이 미션을 성공적으로 완료하지 못할 때마다 예외를 던지는 것입니다. 따라서 발신자 인 경우 yourobject.uploadfile ()을 호출하면 호출이 반환 될 때 파일이 성공적으로 업로드되었다고 가정합니다. 어떤 이유로 든 실패하면, 나는 당신의 객체가 예외를 던질 것으로 기대합니다. 재 시도 할 수있는 명령을 구별하려면 다시 시도해서는 안되며 해당 정보를 예외에 넣고 그에 따라 반응하는 방법을 결정할 수 있습니다.

yourObject.beginasyncuploadfile ()을 호출 할 때, 파일 업로드가 성공했는지 여부를 찾은 다음 예외/오류 속성을 확인하기 위해 IASyncresult 또는 동등한 개체를 기다려야한다는 점을 제외하고는 동일한 동작을 기대할 것입니다. 그렇지 않았다.

결과 코드와 예외는 모두 잘 작동 할 수 있습니다. 그것은 개인적인 취향 (그리고 팀의 다른 사람들의 취향)의 문제입니다. 예외는 특히 더 복잡한 설정에서 몇 가지 장점이 있지만 설정에서는 반환 코드가 잘 작동 할 정도로 간단하게 들립니다.

어떤 사람들은 입에서 거품을 내고 예외를 주장하지만, 내 프로젝트에서는 사람들이 반환 코드의 단순성을 좋아하여 전반적으로 더 나은 선택이됩니다.

이것은 다소 흥미로운 질문입니다. 따라서 '100% 올바른'대답은 없을 것입니다. 대부분 기능을 사용하는 코드가 어떻게 구성되어야한다고 생각하는지에 따라 다릅니다.

내가 보는 방식은 '비참한'상황에서 우아하게 탈출 할 수있는 방법으로 기능을 호출하는 코드를 제공하려는 경우에만 예외를 사용하는 것입니다. 그래서 내 코드에서 나는 보통 무언가가 실제로 예외를 던지고 있습니다. 진짜 끔찍한 일이 일어나고 발신자는 알아야합니다.

이제, 당신이 가진 것이 정상적이고 예상되는 상황이라면 상황이 오류 값을 반환해야 할 것입니다. 그렇게하면 코드는 '더 열심히 시도해야한다'는 것이 필요하다는 것을 알고 있지만, 일어난 일에 의해 타협되지는 않습니다.

예를 들어, 귀하의 경우, 시간 초과를 예상되는 것으로 취급 할 수 있으며, 따라서 오류 코드를 반환하고 통화 코드가 '정상으로 돌아 가기 위해 몇 가지 추가 작업을 수행 해야하는 더 심각한 문제 (전체 보내기 버퍼와 같은)를 반환 할 수 있습니다. '예외로.

그러나 아름다움은 보는 사람의 시선에 있으며, 어떤 사람들은 예외 만 사용한다고 말할 것입니다 (대부분 C 프로그래머)는 반품 코드 만 사용합니다. 예외는 그냥 기억해야합니다 언제나 예외적입니다. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top