Cách ưa thích để ném ngoại lệ trong Magento là gì?


45

Tất cả các phương pháp sau đây được sử dụng trong lõi Magento, vậy phương pháp nào được ưa thích (hoặc "cách thực hành tốt nhất" mới nhất)?

  • Mage::throwException('Some Message')- 732 Công dụng
  • throw new Exception('Some Message')- Công dụng 419
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 Sử dụng
    (cần tạo một Vendor_Module_Exceptionlớp)

2
Làm thế nào bạn tìm thấy số lượng thực thi? Tôi đang hỏi nó vì tò mò muốn biết nó !!!
Rajeev K Tomy

1
@RajeevKTomy Tôi đoán một grep từ dòng lệnh - đại loại như thế 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- mặc dù điều đó đòi hỏi bạn phải biết những gì quá tìm kiếm.
Doug McLean

Câu trả lời:


36

Cuộc gọi Mage::throwExceptionđược sử dụng để ném ngoại lệ của Mage_Core_Exceptiongiống cụ thể . Chúng thường được sử dụng để trình bày các thông báo lỗi cho người dùng cuối. Để biết ví dụ về điều này, hãy tìm kiếm nhanh Mage::throwExceptiontrong mô-đun Mage_Checkout, bạn sẽ tìm thấy nhiều trường hợp thông báo lỗi thực sự được dịch trước khi bị ném, vì cuối cùng nó sẽ được thêm vào đối tượng phiên và hiển thị cho người dùng trên trang kết quả.

Sử dụng new Exceptionhoặc một cái gì đó giống như new My_Custom_Exceptionthông thường sẽ là nơi bạn đang ném lỗi nội bộ vào ứng dụng, những lỗi rất có thể sẽ không bao giờ được hiển thị cho người dùng cuối. Có thể bạn nắm bắt được chúng và xử lý chúng một cách duyên dáng (sử dụng tốt cho một loại ngoại lệ tùy chỉnh trong một số trường hợp) hoặc những lần khác chúng kết thúc bị bắt, ghi lại và chấm dứt yêu cầu với thông báo lỗi chung hơn được hiển thị cho người dùng.

Tôi chưa bao giờ sử dụng cá nhân Mage::exceptionnhưng dường như đó là một nỗ lực để tạo mẫu có một loại ngoại lệ duy nhất cho mỗi mô-đun. Sẽ không có hại gì khi sử dụng nó, vì về cơ bản, nó là một nhà máy trả về một trường hợp ngoại lệ cho mô-đun đã cho, mặc dù (tại thời điểm viết bài này), nó không thực hiện bất kỳ hỗ trợ nào cho những thứ như ghi đè.


Tôi thích lý do của bạn ở đây - đó là tiếng Anh đơn giản :)
philwinkle

Tôi gọi Mage::throwException('my error message')trong lớp người trợ giúp của tôi nhưng không có gì xảy ra ??
Đen

16

Bạn đã thực hiện phần khó khăn, tìm hiểu tần suất sử dụng :)

tl; dr: IMHO, bạn nên sử dụng Mage::throwExceptionthường xuyên nhất, quay lại Mage::exceptionkhi bạn cần đưa ra một loại ngoại lệ từ bên ngoài phạm vi mô-đun của mình, nếu không vì lý do nào khác ngoài khả năng nhắn tin phiên và thực tế là bạn không phải gõ throw newtrước mặt nó

Đây là sự cố:

  • Mage::throwExceptionvề cơ bản là một trình bao bọc Mage_Core_Exception($message)với chức năng bổ sung là có thể thêm ngoại lệ vào phiên thông qua một getSingletoncuộc gọi được kết nối vớiaddMessage
  • new Exception()là cách cốt lõi của PHP để đưa ra một ngoại lệ, nhưng yêu cầu bạn sử dụng throwtừ khóa và có lẽ là "trình diễn" lớn hơn một chút vì hai cái còn lại là các hàm bao có chức năng bổ sung.
  • Như đã đề cập, Mage::exceptioncũng là một trình bao bọc, nhưng có lợi ích là cho phép bạn khởi tạo lớp ngoại lệ của riêng bạn. Điều này thực sự hữu ích nếu bạn là nhà phát triển plugin và cần tạo nhật ký tùy chỉnh cho các trường hợp ngoại lệ, riêng biệt, không có chức năng logExceptioncung cấp (ví dụ: không có stack trac) hoặc muốn thực hiện lệnh gọi API ngoại lệ, v.v. bạn muốn throwcó một ngoại lệ của một loại lớp khác nhau, ví dụ, những gì xảy ra Mage_Paypal, thường đưa ra một Mage_Coreloại ngoại lệ.

Nói về thời gian cách nhau chưa đến 10 giây. :)
davidalger

Lý do ưu tiên giữa new Exception()Mage::exception()không rõ ràng với tôi nhất. Khi tôi xem Mage::exception()mã, tôi không thấy bất kỳ lợi ích nàothrow $exception , nó thực sự cản trở bạn chọn lớp ngoại lệ bạn đã định cấu hình tự động tải tiêu chuẩn cho phần mở rộng (của bạn / an) vì nó tiền tố tên lớp, cản trở phân tích tĩnh và không cho phép bạn gọi các phương thức bổ sung ngoại lệ tại nó ném trực tiếp.
hakre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.