Apa cara yang disukai untuk melempar pengecualian di Magento?

45

Semua metode berikut digunakan dalam inti Magento sehingga yang mana yang lebih disukai (atau "praktik terbaik" terbaru) cara?

  • Mage::throwException('Some Message')- 732 Penggunaan
  • throw new Exception('Some Message')- 419 Penggunaan
  • throw Mage::exception('Vendor_Module', 'Some Message')- 94 Penggunaan
    (perlu membuat Vendor_Module_Exceptionkelas)
Salman von Abbas
sumber
2
bagaimana Anda menemukan jumlah eksekusi? Saya meminta rasa ingin tahu untuk mengetahuinya !!!
Rajeev K Tomy
1
@ RajeevKTomy Saya menduga grep dari baris perintah - sesuatu seperti 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- meskipun itu mengharuskan Anda tahu apa yang juga dicari.
Doug McLean

Jawaban:

36

Panggilan Mage::throwExceptionitu digunakan untuk melemparkan pengecualian dari Mage_Core_Exceptionvarietas tertentu . Ini umumnya digunakan untuk menyajikan pesan kesalahan kepada pengguna akhir. Untuk contoh ini, lakukan pencarian cepat Mage::throwExceptiondi modul Mage_Checkout, Anda akan menemukan banyak contoh di mana pesan kesalahan sebenarnya sedang diterjemahkan sebelum dilemparkan, karena pada akhirnya akan ditambahkan ke objek sesi dan ditampilkan kepada pengguna di halaman yang dihasilkan.

Menggunakan new Exceptionatau sesuatu seperti new My_Custom_Exceptionbiasanya akan menjadi tempat Anda melemparkan kesalahan internal ke aplikasi, kesalahan yang kemungkinan besar tidak boleh ditampilkan kepada pengguna akhir. Mungkin Anda menangkap ini dan menanganinya dengan anggun (penggunaan yang baik untuk jenis pengecualian khusus dalam beberapa kasus), atau di lain waktu mereka berakhir tertangkap, dicatat dan diakhiri permintaan dengan pesan kesalahan yang lebih umum ditampilkan kepada pengguna.

Saya tidak pernah secara pribadi menggunakan Mage::exceptiontetapi tampaknya merupakan upaya untuk pola memiliki tipe pengecualian unik untuk setiap modul. Tidak akan ada salahnya dilakukan dalam menggunakannya, karena pada dasarnya ini adalah pabrik yang mengembalikan contoh pengecualian untuk modul yang diberikan, meskipun (pada saat penulisan ini) tidak menerapkan dukungan untuk hal-hal seperti penimpaan.

davidalger
sumber
Saya suka alasan Anda di sini - ini dalam bahasa Inggris yang sederhana :)
philwinkle
Saya memanggil Mage::throwException('my error message')kelas pembantu saya tetapi tidak ada yang terjadi ??
Black
16

Anda telah melakukan bagian yang sulit, mencari tahu seberapa sering mereka digunakan :)

tl; dr: IMHO, Anda harus Mage::throwExceptionpaling sering menggunakan , kembali ke Mage::exceptionsaat Anda perlu menaikkan jenis pengecualian dari luar ruang lingkup modul Anda, jika tanpa alasan lain selain kemampuan pesan sesi dan fakta bahwa Anda tidak harus mengetik throw newdi depannya.

Berikut rinciannya:

  • Mage::throwExceptionpada dasarnya adalah pembungkus untuk Mage_Core_Exception($message)dengan fungsionalitas tambahan karena dapat menambahkan pengecualian ke sesi melalui getSingletonpanggilan yang dirantaiaddMessage
  • new Exception()adalah cara inti PHP untuk melempar pengecualian, tetapi mengharuskan Anda untuk menggunakan throwkata kunci dan mungkin sedikit lebih besar "performan" karena dua lainnya adalah pembungkus dengan fungsionalitas tambahan.
  • Seperti disebutkan, Mage::exceptionadalah pembungkus juga, tetapi memiliki manfaat memungkinkan Anda untuk membuat instance kelas pengecualian Anda sendiri. Ini sangat membantu jika Anda seorang pengembang plugin dan perlu membuat log khusus untuk pengecualian, secara terpisah, tanpa fungsi yang logExceptionmenyediakan (mis., Tidak ada stack trac) atau ingin membuat panggilan API dengan pengecualian, dll. Ini juga berguna saat Anda ingin throwpengecualian dari tipe kelas yang berbeda, misalnya, apa yang terjadi di Mage_Paypal, sering meningkatkan Mage_Corejenis pengecualian.
Philwinkle
sumber
Bicara tentang waktu ... jarak kurang dari 10 detik. :)
davidalger
Alasan preferensi antara new Exception()dan Mage::exception()tidak jelas bagi saya yang terbaik. Ketika saya melihat ke dalam Mage::exception()kode, saya tidak melihat apa manfaat lebih throw $exception, itu benar-benar menghalangi Anda untuk memilih kelas pengecualian Anda telah dikonfigurasi standar auto-loading dalam (/ an Anda) ekstensi seperti prefiks ClassName, menghalangi analisis statis dan tidak memungkinkan Anda untuk memanggil metode tambahan dengan pengecualian itu melempar langsung.
hakre