Pertanyaan bagus +1
Melakukan beberapa penelitian dan tes setelah titik yang baik ke arah setelah diskusi saya dengan @ mw pada jawaban pertama saya. Saya salah memahaminya untuk pertama kalinya.
Akan menambahkan beberapa kode untuk memperjelas sehingga orang lain memahami masalah ini dengan lebih baik.
Sebuah catatan sebelum lepas landas
Saya tidak pernah memiliki masalah seperti itu sampai ini muncul. Berkembang di Magento dengan mode pengembang diaktifkan, saya bahkan tidak berpikir sedetik pun tentang ini. Jadi setiap kali saya kentut , itu akan muncul dan akan diperbaiki sesuai.
Masalah dengan sampel yang menjelaskan
Kesalahan fatal Anda akan dicatat (jika diaktifkan) dan kode akan terus seperti biasa karena tidak ada kesalahan yang dilemparkan oleh mageCoreErrorHandler
atau program akan melakukannya exit
.
Penangan kesalahan inti Magento pertama untuk kesalahan yang tidak dapat ditandingi app/code/core/Mage/Core/functions.php
/**
* Custom error handler
*
* @param integer $errno
* @param string $errstr
* @param string $errfile
* @param integer $errline
*/
function mageCoreErrorHandler($errno, $errstr, $errfile, $errline){
/**
* Some internal logic here for building the error message
*/
$errorMessage .= ": {$errstr} in {$errfile} on line {$errline}";
if (Mage::getIsDeveloperMode()) {
throw new Exception($errorMessage);
} else {
Mage::log($errorMessage, Zend_Log::ERR);
}
}
Seperti yang Anda lihat, dalam mode pengembang itu akan memberi tahu sesuatu yang bermanfaat, itu melempar kesalahan. Ketika dimatikan akan masuk (jika diaktifkan) dan melanjutkan.
Bukti
Saya testfile.php
require 'app/Mage.php';
Mage::app('admin')->setUseSessionInUrl(false);
// Test function which expect Customer_Model_Customer
function test(Customer_Model_Customer $customer)
{
var_dump('Do not show me because ' . get_class($customer) . ' is not a customer.');
}
// Enabled developer mode
Mage::setIsDeveloperMode(true);
// Put a var in here
$noGood = Mage::app();
// Make some context
var_dump('hello');
try {
// Call test function with a not accepted var
test($noGood);
// Tell if we get here
var_dump('And we are here!');
} catch (Exception $e) {
var_dump('You should die, because I am doing something which I should not do');
}
Hasil
Developermode diaktifkan. Hasil yang benar
string(5) "hello"
string(66) "You should die, because I am doing something which I should not do"
Developermode dinonaktifkan, Hasil salah
string(5) "hello"
string(61) "Do not show me because Mage_Core_Model_App is not a customer."
string(16) "And we are here!"
Jadi pada akhirnya akan melewatkan kesalahan dan melanjutkan pada baris kode berikutnya. Mungkin dengan hasil yang lebih aneh. (seperti yang ditunjukkan oleh @mpw)
Kesimpulan
Bisa saja terjadi bahwa seseorang berkembang sedemikian rupa sehingga kesalahan tidak diperhatikan dan pada akhirnya akan memberikan hasil yang tidak terduga.
Tentu ketika berkembang secara profesional. Kesalahan akan akan melihat dan perhatian yang diperhatikan. Cara untuk mencegah ini di Magento selalu memungkinkan developermode di lingkungan pengembang / uji.
IMHO seharusnya tidak pernah sampai ke titik diskusi ini, di mana memeriksa variabel untuk kedua kalinya (setidaknya itulah yang akan saya jelaskan) adalah cara untuk pergi. Kode harus diuji sebelum dirilis di lingkungan produksi. Seharusnya tidak diperlukan.
Pikiran kedua
Mungkin Magento harus berhenti setelah kesalahan fatal. Atau buat laporan dan tunjukkan kepada pengunjung. Dengan cara ini, baris kode berikutnya tidak akan pernah dieksekusi, dan hal-hal akan diperhatikan.
Pertanyaan bagus. Saya pikir ini adalah masalah umum
E_RECOVERABLE_ERROR
dalam PHP.Apa yang Anda miliki dalam pertanyaan Anda adalah penangan pengecualian, bukan penangan kesalahan. Penangan kesalahan menyebabkan masalah aktual yang Anda diskusikan di sini dengan kesalahan fatal yang dapat ditangkap (
E_RECOVERABLE_ERROR
) .PHP 7 dan HHVM sudah menyelesaikan ini.
Ini lebih buruk dengan Magento karena penangan kesalahan tidak berurusan dengan ini sejak kelas kesalahan PHP 5.2.
Jenis penanganan kesalahan yang lebih bermanfaat adalah menangani kelas kesalahan ini dan mengubah kesalahan ini menjadi ErrorException s. Contoh (bukan oleh saya, dari sini ):
Jadi dalam terang Magento, penangan kesalahan default adalah fungsi global
mageCoreErrorHandler
diapp/code/core/Mage/Core/functions.php
. Itu bisa didaftarkan melaluiMage::app()
olehinit()
metode yang Mage_Core_Model_App (app/code/core/Mage/Core/Model/App.php
) (via dilindungi_initEnvironment()
metode).Sebuah pengamat
controller_front_init_before
yang mendaftarkan penangan kesalahan PHP Anda sendiri di atas sudah cukup maka (penangan kesalahan dalam PHP dapat ditumpuk):kesalahan fatal yang dapat ditangkap kemudian diubah menjadi pengecualian dan Anda dapat menanganinya dalam kode ekstensi Anda sendiri atau tidak tertangkap dan akan terlihat di log pengecualian (alih-alih toko Anda menjalankan gaga pada jenis yang salah seperti perilaku saat ini, program yang mati jangan bohong ). Dalam PHP 7 pengecualian untuk mencari tidak ErrorException itu tapi TypeException (yang merupakan BaseException ) untuk kesalahan fatal yang sekarang dapat ditangkap .
Semua kesalahan lain diteruskan ke penangan kesalahan Magento.
Catatan: Saya belum mencoba ini, ini adalah artikel tetapi saya tahu masalah yang Anda tanyakan dan analisis penanganan kesalahan telah dilakukan terhadap 1.5.1.0 dan diverifikasi terhadap 1.9.1.0 melalui analisis kode. Penumpukan penangan kesalahan harus berhasil. Saya menambahkan sedikit contoh kode yang menunjukkan sebagian besar komponen berfungsi.
Saya belum mengemas ini sebagai ekstensi magento tetapi harus lurus ke depan dengan modman. Saya akan menaruhnya di github.
Lampiran: Demo Handler Demo
Contoh kode berikut ( demo online ) menunjukkan penumpukan penangan kesalahan dan pengecualian terhadap kesalahan fatal yang dapat ditangkap :
Output Program
sumber
Ini sudah ditangani oleh PHP default dengan menambahkan
(Exception $e)
definisi parameter fungsi.Anda tidak bisa meneruskan hal lain ke fungsi ini selain Pengecualian atau perluasan Pengecualian.
sumber
mageCoreErrorHandler
fungsinya. Kesalahan yang dipicu oleh params yang salah akan ditangani dan dan ditekan dalam mode non-pengembang, dan melemparException
dalam mode pengembang.mageCoreErrorHandler
untuk memastikan bahwa pengunjung tidak akan mendapatkan kesalahan yang dilemparkan ke wajah mereka. Anda bisa membangun sendiritry{}catch(){}
untuk mengambilnya sendiri, dan jika Anda tidak bisa meneruskannya.