2008-09-15 6 views
2

대부분의 프로그램 언어에는 일종의 예외 처리가 있습니다. 일부 언어는 리턴 코드가 있고, 다른 언어는 try/catch 또는 rescue/retry 등이 있습니다. 각 그룹은 가독성, 견고 함 및 대규모 그룹 개발 노력의 실질적인 효과면에서 고유 한 특성을 가지고 있습니다. 어느 것이 가장 좋은 이유는 무엇입니까?예외 메커니즘의 가장 좋은 구현은 무엇입니까?

+0

이 맥락에서 "최고"를 정의하십시오 참조하십시오. 내가 말했듯이 –

+0

은 대규모 그룹 개발 노력에서 독자적인 가독성, 견고성 및 실질적인 효과가 있습니다. – user9613

답변

2

나는 그 문제의 성격에 달려 있다고 말할 것입니다. 다른 문제 영역은 거의 임의의 오류 메시지를 요구할 수있는 반면 다른 사소한 작업은 NULL 또는 오류 -1을 반환 할 수 있습니다.

오류 리턴 코드의 문제점은 API 클라이언트가 오류 코드를 확인해야한다는 것을 모른 채 무시할 수 있기 때문에 오류를 오염/마스킹하는 것입니다. 그것은 현재의 메서드로부터 (합리적으로) 유효한 출력을 제공합니다.

일부지도의 색인 키를 요청한 목록을 저장하고 계속 실행하는 API가 있다고 가정 해보십시오. 나중에 API가 콜백을 보내면이 메소드는이 예에서 -1 일 수있는 키 (오류 코드)를 사용하여 테이블을 트래버스 할 수 있습니다. BOOM, 일부 배열에서 -1로 인덱스를 만들 때 응용 프로그램이 충돌하며 이러한 종류의 문제는 해결하기가 매우 어려울 수 있습니다. 이것은 여전히 ​​사소한 예이지만 오류 코드와 관련된 문제를 보여줍니다.

반면에 오류 코드는 예외를 throw하는 것보다 빠르며 이러한 오류 코드를 반환하는 것이 적절한 경우 자주 액세스하는 메서드 호출에 오류 코드를 사용하려고 할 수 있습니다. 개인용 어셈블리 내에서 이러한 종류의 오류 코드를 캡슐화하려고하면 오류 코드가 API의 클라이언트에 노출되지 않으므로 문제가되지 않는다고 말할 수 있습니다. 이러한 종류의 핵무기는 시작되기 전에 방아쇠를 당긴 이후 오랜 시간 동안 응용 프로그램에 남아있을 수 있기 때문에 항상 이러한 방법을 엄격하게 문서화해야합니다.

개인적으로 나는 어느 정도 양쪽 모두를 선호합니다. 프로그램이 예상치 못한 상태로 돌입했고 어떤 것을 알릴 필요가있을 때 계획에서 벗어난 예외에 대해서만 예외를 사용합니다. 필자는 코드 전체에 try/catch 블록을 작성하는 것을 망설이지 만 개인적인 취향에 따라 다름 없다.

0

try/catch/finally는 훌륭하게 작업을 수행합니다.

프로그래머는 일반적인 장애뿐만 아니라 특정 조건을 정상적으로 처리 할 수 ​​있습니다.

모두는 말했고 나는 각각이 다른 것과 마찬가지로 좋다고 확신합니다.

0

try/catch 개념을 사용해야합니다. 코드 유지 관리 담당자에게 가장 많이 제공되는 가독성과 같은 느낌입니다. 예외가 적절하게 입력되고 관련 메시지에 상세한 데이터가 포함되어있는 한 함수 호출 체인을 찾는 것은 상당히 간단합니다 (개인적으로 스택 추적을 포함하는 것을 좋아하지 않지만 누구를하는지 잘 압니다. 더 많은 추적이 가능합니다.) 리턴 코드 구현에는 프로그램별로 코드 정의의 외부 테이블이 필요합니다. 개인적인 경험을 바탕으로 유지 보수와 참조가 다루기 힘들다.

1

무엇을 가장 좋습니까? 언어 디자인은 언제나 단점입니다. 리턴 코드의 이점은 일반 함수 호출 외에 런타임 지원이 필요 없다는 것입니다. 단점은 1) 당신은 항상 그것들을 체크해야만한다. 2) 리턴 타입은 함수 호출의 유효한 결과가 아닌 실패 값을 가져야한다.

자동 예외 처리의 장점은 코드의 오류 조건이 사라지지 않는다는 것입니다.

다양한 언어 (및 Lisp의 조건 시스템, E의 배출기 등)의 예외 처리 의미론의 차이는 주로 프로그램 실행을 계속해야 할 때 스택 되감기가 처리되는 방식에 나타납니다.

요약하면, 자동 예외 처리는 특히 대규모 팀에서 읽기 쉽고 강력한 소프트웨어를 작성해야 할 때 매우 유용합니다. 컴퓨터가 오류 조건을 추적하게하면 코드를 읽을 때 고려할 점이 하나 줄어들며 오류 기회가 제거됩니다. 오류를 나타 내기 위해 반환 코드를 사용하는 유일한 방법은 예외 처리 기능이없는 언어에서 예외 처리 언어를 구현하는 경우입니다. 예외 처리에 특이 한 관점에 대한