Sunting: Silakan baca komentar. Ternyata ini hanya berfungsi dengan baik di V8 (Chrome / Node.JS) Maksud saya adalah untuk memberikan solusi lintas-browser, yang akan bekerja di semua browser, dan menyediakan jejak tumpukan di mana ada dukungan.
Sunting: Saya membuat Wiki Komunitas ini untuk memungkinkan pengeditan lebih lanjut.
Solusi untuk V8 (Chrome / Node.JS), berfungsi di Firefox, dan dapat dimodifikasi agar berfungsi sebagian besar dengan benar di IE. (lihat akhir posting)
function UserError(message) {
this.constructor.prototype.__proto__ = Error.prototype // Make this an instanceof Error.
Error.call(this) // Does not seem necessary. Perhaps remove this line?
Error.captureStackTrace(this, this.constructor) // Creates the this.stack getter
this.name = this.constructor.name; // Used to cause messages like "UserError: message" instead of the default "Error: message"
this.message = message; // Used to set the message
}
Posting asli pada "Tunjukkan kodenya!"
Versi pendek:
function UserError(message) {
this.constructor.prototype.__proto__ = Error.prototype
Error.captureStackTrace(this, this.constructor)
this.name = this.constructor.name
this.message = message
}
Saya tetap this.constructor.prototype.__proto__ = Error.prototype
di dalam fungsi untuk menyimpan semua kode. Tetapi Anda juga dapat mengganti this.constructor
dengan UserError
dan itu memungkinkan Anda untuk memindahkan kode ke luar fungsi, sehingga hanya dipanggil sekali.
Jika Anda pergi ke rute itu, pastikan Anda menelepon saluran itu sebelum pertama kali Anda melempar UserError
.
Peringatan itu tidak menerapkan fungsi, karena fungsi dibuat terlebih dahulu, apa pun urutannya. Dengan demikian, Anda dapat memindahkan fungsi ke akhir file, tanpa masalah.
Kompatibilitas Browser
Bekerja di Firefox dan Chrome (dan Node.JS) serta memenuhi semua janji.
Internet Explorer gagal sebagai berikut
Kesalahan tidak harus err.stack
dimulai dengan, jadi "itu bukan salahku".
Error.captureStackTrace(this, this.constructor)
tidak ada sehingga Anda perlu melakukan hal lain seperti
if(Error.captureStackTrace) // AKA if not IE
Error.captureStackTrace(this, this.constructor)
toString
tidak ada lagi saat Anda subkelas Error
. Jadi, Anda juga perlu menambahkan.
else
this.toString = function () { return this.name + ': ' + this.message }
IE tidak akan mempertimbangkan UserError
menjadi instanceof Error
kecuali Anda menjalankan beberapa waktu sebelum Andathrow UserError
UserError.prototype = Error.prototype
this.name = 'MyError'
luar fungsi dan mengubahnya keMyError.prototype.name = 'MyError'
.