2009-04-15 2 views
2

슬프게도 필자는 계속해서 필자가 기능을 추가해야하는 레거시 PHP4 시스템을 가지고 있습니다. 몇 년되지 않아도 몇 달 동안 PHP5로 포트를 할 수있는 자원이있는 것 같지 않습니다. 지난 몇 년 동안, 나를 괴롭혔던 주요한 것들 중 하나는 예외를 깨끗이 던질 수있는 능력이 없다는 것입니다. 이 때문에 모든 종류의 오류 검사 코드는 계속 진행되고있는 일의 흐름을 끊임없이 중단해야합니다.가장 좋은 대안 예외 처리 모델

그래서 예외 모델이없는 언어에서 예외 처리의 청결을 에뮬레이트하는 데 가장 좋은 전략은 무엇입니까?

조엘이 답변에서 언급 한 바와 같이 예외에 관한 말을 가지고

http://www.joelonsoftware.com/items/2003/10/13.html

그들은 함수에 너무 많은 가능한 종료 지점을 만듭니다. 올바른 코드를 작성하려면 함수를 통해 가능한 모든 코드 경로를 고려해야합니다. 예외를 발생시키고 그 자리에서 그것을 잡을 수없는 함수를 호출 할 때마다 갑자기 종료 된 함수로 인해 깜짝 버그가 생길 수 있으며 데이터가 일관성없는 상태로 남거나 그렇지 않은 다른 코드 경로가 생길 수 있습니다 생각 해봐.

더 나은 대안은 함수가 잘못되었을 때 오류 값을 반환하고이를 상세하게 처리하더라도 명시 적으로 처리하는 것입니다. 단순한 3 라인 프로그램이 48 번 라인으로 번지는 것은 좋은 오류 검사를 할 때 생기는 것이지만, 그게 인생이고, 예외적으로 끝내면 프로그램이 더 강력 해지는 것은 아닙니다. C/C++/Java 스타일 언어의 프로그래머가 예외에 끌리는 이유는 구문에 여러 값을 반환하는 함수를 간단하게 호출 할 수있는 방법이 없기 때문입니다. 따라서 반환 값을 생성하는 함수를 작성하기가 어렵습니다. 값을 반환하거나 오류를 반환합니다.

그러나 언어에서 좋은 예외 모델은 실제로 호출 된 함수가 실제로 예외를 throw하도록 지정합니다. 이는 exaactly 함수가 종료 될 곳을 0으로 추가한다는 것을 의미합니다 (코드는 예외를 throw하는 대신 false를 반환합니다). 그러나 함수가 종료되는 곳은 정확히 1 곳 더 있습니다. 호출 함수. 누구나 수 있습니다 다른 사람에 의해 다루어지기 위해 모든 예외를 통과시키는 엉성한 코드를 작성하십시오. 그렇다고해서 반드시 이되어야합니다.은 깨끗하고 효율적으로 사용할 수있는 도구를 제거해야합니다.

실제로 모든 함수는 호출 코드의 예상 반환 값 범위를 벗어나는 값을 반환 할 수 있습니다. 좋은 프로그래머는 오류 코드와 조건을 포함하여 가능한 모든 반환 값을 다룰 것입니다. 예외 모델은 그에게 깨끗하게 할 수있는 방법을 제공합니다.

답변

3

먼저, one of the founders of this site을 포함하여 예외가 올바른 오류 모델이 아니라고 생각하는 사람들이 있습니다.

두 번째로, PHP의 부 버전에서는 어떤 오류 처리 기능을 사용할 수 있는지 인벤토리를 작성하려고합니다.즉각적인 반응은 좋은 오류 처리기를 작성하는 데 시간을 투자하는 것이고 register it을 제안하는 것입니다.

그런 다음 일반적으로 예외를 throw하는 응용 프로그램 실행에서 trigger errors을 대신 사용할 수 있습니다. 운이 좋으면 debug_backtrace()을 사용할 수 있습니다.

행운을 빈다.

+0

실제로 좋은 오류 처리기를 만드는 방법을 살펴 보았지만 로컬 파일에서 로컬 오류 처리를 유지하는 방법을 찾지 못했습니다. 한 가지 생각은 debug_backtrace의 결과를 사용하여 현재 클래스를 파악한 다음 해당 클래스에서 특정 "handle_error"메소드를 호출하는 것입니다. 어떻게 생각해? – Zak

+0

필자는 이것이 제대로 작동 할 수 있다고 생각합니다. 그러나 솔직히 말해서 - 나는 아마 3 년 안에 PHP4를 사용하지 않았습니다. 어쩌면 더 길 수도 있습니다. 들러서 일하게하려면 여기에 의견을 남겨주세요! –

2

Continuation passing style. 사실, 나는 "예쁘다"라는 측면에서 예외를 능가한다고 말한다. PHP에 가장 적합한 것은 아니지만 방문자와 같은 객체와 패턴을 사용하여 구현할 수 있습니다.

하지만 실제로 PHP4에서 PHP5로 업그레이드하는 데는 몇 시간이 걸릴 필요가 없습니다. 대부분 이전 버전과 호환됩니다.

+0

-1 "단지 몇 시간 동안". 내가 말했던 유명한 거짓말 아래에있는 파일 : –

+0

@ Alan에 대한 이해, T 셔츠, 기념품 찻잔, 소박한 모자와 타임 쉐어 =를 구입했다.) –

+0

하하 @ 앨런. CPS를 사용하기 위해 기존의 코드베이스를 개조하는 것이 자체적으로 어려운 일일 수 있습니다. –