วิธีที่แนะนำในการโยนข้อยกเว้นใน Magento คืออะไร


45

วิธีการทั้งหมดต่อไปนี้ใช้ในวีโอไอพีคอร์ดังนั้นวิธีใดที่เป็นวิธีที่ต้องการ (หรือ "วิธีปฏิบัติที่ดีที่สุด") ล่าสุด?

  • Mage::throwException('Some Message')- 732 ประเพณี
  • throw new Exception('Some Message')- 419 ประเพณี
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 ประเพณี
    (จำเป็นต้องสร้างVendor_Module_Exceptionชั้นเรียน)

2
คุณคิดว่าการประมวลผลเป็นอย่างไรฉันขอให้อยากรู้อยากเห็นรู้ !!!
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')ชั้นผู้ช่วย แต่ไม่มีอะไรเกิดขึ้น
Black

16

คุณได้ทำส่วนที่ยากแล้วและหาว่าพวกเขาใช้งานบ่อยแค่ไหน :)

tl; dr: IMHO คุณควรใช้Mage::throwExceptionบ่อยที่สุดถอยกลับไปMage::exceptionเมื่อคุณจำเป็นต้องเพิ่มประเภทข้อยกเว้นจากนอกขอบเขตของโมดูลของคุณหากไม่มีเหตุผลอื่นนอกเหนือจากความสามารถในการส่งข้อความของเซสชันและความจริงที่ว่าคุณไม่ได้ ต้องพิมพ์throw newด้านหน้าของมัน

นี่คือรายละเอียด:

  • Mage::throwExceptionเป็นตัวห่อหุ้มที่Mage_Core_Exception($message)มีฟังก์ชั่นเพิ่มเติมของความสามารถในการเพิ่มข้อยกเว้นไปยังเซสชั่นผ่านgetSingletonสายที่ถูกล่ามโซ่ด้วยaddMessage
  • new Exception()เป็นวิธีหลักของ PHP ในการยกเว้น แต่คุณต้องใช้throwคำหลักและน่าจะเป็น "นักแสดง" ที่มีขนาดใหญ่กว่าเล็กน้อยเนื่องจากอีกสองรายการนั้นเป็นตัวห่อหุ้มที่มีฟังก์ชั่นพิเศษ
  • ดังกล่าวMage::exceptionเป็นเสื้อคลุมด้วยเช่นกัน แต่มีประโยชน์ในการช่วยให้คุณสามารถยกตัวอย่างคลาสยกเว้นของคุณเอง สิ่งนี้มีประโยชน์จริง ๆหากคุณเป็นผู้พัฒนาปลั๊กอินและจำเป็นต้องสร้างบันทึกที่กำหนดเองสำหรับข้อยกเว้นแยกต่างหากโดยไม่มีฟังก์ชันการทำงานที่logExceptionให้ (เช่นไม่มีแทร็กสแต็ค) หรือต้องการทำการเรียก API แบบยกเว้น คุณต้องการ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.