마 젠토에서 예외를 던지는 가장 좋은 방법은 무엇입니까?


45

다음의 모든 방법이 Magento 코어에서 사용되므로 어떤 방법이 선호되는 (또는 최신 "모범 사례") 방법입니까?

  • Mage::throwException('Some Message')- 732 개 용도
  • throw new Exception('Some Message')- 419 개 용도
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 개 용도
    (필요 만드는 Vendor_Module_Exception클래스)

2
execption count를 어떻게 찾았습니까? 그것을 알고 호기심을 요구합니다!
Rajeev K Tomy

1
@RajeevKTomy 명령 줄에서 grep을 추측하고 grep -r throwException /path/to/magento/app/code/core | wc -l ; grep -r throw\ new /path/to/magento/app/code/core | wc -l ; grep -r throw\ Mage /path/to/magento/app/code/core | wc -l있습니다.
Doug McLean

답변:


36

이 호출 Mage::throwException은 특정 Mage_Core_Exception다양성의 예외를 발생시키는 데 사용됩니다 . 일반적으로 최종 사용자에게 오류 메시지를 표시하는 데 사용됩니다. 예를 들어 Mage::throwException, Mage_Checkout 모듈에서 빠른 검색을 수행 하면 오류 메시지가 발생하기 전에 실제로 변환되는 많은 인스턴스를 찾을 수 있습니다. 결과 페이지.

사용 new Exception또는 이와 유사한 new My_Custom_Exception것은 일반적으로 응용 프로그램 내부에서 오류를 발생시키는 곳이며, 최종 사용자에게는 절대 표시되지 않아야 할 오류입니다. 어쩌면 이것들을 잡아서 정상적으로 처리하거나 (일부 경우 사용자 정의 예외 유형에 잘 사용) 다른 시간에 잡히면 더 일반적인 오류 메시지가 표시되어 요청이 사용자에게 표시됩니다.

개인적으로 사용한 적이 없지만 Mage::exception각 모듈마다 고유 한 예외 유형을 갖는 패턴을 시도하는 것으로 보입니다. 본질적으로 주어진 모듈에 대해 예외 인스턴스를 반환하는 팩토리이므로 사용에 아무런 해가 없습니다. (이 글을 쓰는 시점에서는) 재정의와 같은 것들에 대한 지원을 구현하지는 않습니다.


나는 당신의 추론을 좋아합니다-그것은 평범한 영어입니다 :)
philwinkle

나는라는 Mage::throwException('my error message')내 헬퍼 클래스에 있지만 아무 반응이 없습니다 ??
검은

16

당신은 그들이 얼마나 자주 사용하는지 알아내는 데 어려움을 겪었습니다. :)

tl; dr : IMHO, Mage::throwException가장 자주 사용해야 Mage::exception하며 세션 메시징 기능과 다른 이유가없는 경우 모듈 범위 밖에서 예외 유형을 제기해야 할 때로 되돌아갑니다. throw new앞에 입력해야 합니다.

고장은 다음과 같습니다.

  • Mage::throwException기본적으로 Mage_Core_Exception($message)getSingleton연결된 호출을 통해 세션에 예외를 추가 할 수있는 추가 기능이 있는 래퍼 입니다addMessage
  • new Exception()는 예외를 던지는 핵심 PHP 방법이지만 throw키워드 를 사용해야 하며 다른 두 기능은 추가 기능이있는 래퍼이므로 가장 작은 "성능"일 수 있습니다.
  • 언급했듯이 Mage::exception래퍼이기도하지만 예외 클래스를 인스턴스화 할 수 있다는 이점이 있습니다. 이는 플러그인 개발자이고 예외 (예 : 스택 추적 없음)를 제공하거나 예외에 대한 API 호출을 원하는 기능없이 예외에 대한 사용자 정의 로그를 별도로 작성해야하는 경우에 매우 유용 합니다 logException. throw클래스 유형이 다른 예외 를 원합니다 ( 예 :에서 발생하는 경우가 Mage_Paypal많으며 Mage_Core예외 유형이 자주 발생 함) .

10 초 미만의 간격으로 타이밍에 대해 이야기하십시오. :)
davidalger

간 선호도의 추론 new Exception()과는 Mage::exception()최선을 나에게 분명하지 않다. Mage::exception()코드를 살펴보면에 대한 이점 이 보이지 않습니다. throw $exception실제로 클래스 이름 앞에 접두어가있는 정적 자동로드 및 정적 분석 및 예외가 발생하면 직접 추가 메소드를 호출 할 수 없습니다.
hakre
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.