Mengendalikan ralat dalam Javascript/Typescript: Pengecualian dan Hasil Tersuai

Patricia Arquette
Lepaskan: 2024-11-22 03:25:11
asal
711 orang telah melayarinya

Manejando errores en Javascript / Typescript: Excepciones personalizadas y Result

Tindakan seperti memanggil API atau mengesahkan data yang dimasukkan oleh pengguna adalah sangat biasa dalam pembangunan dan merupakan contoh fungsi yang boleh memberikan hasil yang betul atau gagal. Biasanya untuk mengawalnya dalam javascript (dan bahasa lain) kami biasanya menggunakan dan mencipta pengecualian mudah.

Ia kelihatan seperti cara paling mudah untuk mengawal ralat yang mungkin ada pada aplikasi atau program yang sedang kami bangunkan. Walau bagaimanapun, apabila projek dan pasukan berkembang, senario mula muncul yang memerlukan sesuatu yang lebih daripada kami. Dalam pasukan besar, sebagai contoh, ia banyak membantu jika fungsi jelas apabila menunjukkan sama ada mereka boleh gagal, untuk membolehkan rakan sekerja kami menjangka dan mengurus ralat tersebut.

Bersikap eksplisit dengan jenis "ralat" yang boleh dilakukan oleh tindakan bukan sahaja akan membantu menjadikan pembangunan lebih mudah. Ia juga akan berfungsi sebagai dokumentasi peraturan perniagaan.

Dalam javascript kami mempunyai beberapa teknik untuk mencapai ini. Untuk melangkaui teori, mari kita pertimbangkan contoh kehidupan sebenar: dalam apl tempahan hotel, pengguna menempah bilik, menerima kod, dan kemudian mesti membayarnya. Semasa membuat pembayaran, API boleh menunjukkan kepada kami 3 senario "ralat" ini:

El código de reserva no existe.
El pago es rechazado.
El código de reserva ya no es válido.
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ketika kami membuat aplikasi untuk pengguna, sebagai tambahan kepada dua kes tersebut, anda harus mengambil kira satu tambahan:

No hay conexión a internet. (o el servicio no esta disponible)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Fungsi ini boleh dipanggil daripada komponen aplikasi kami yang berbeza dan jika gagal, ralat mesti ditunjukkan kepada pengguna.

Dengan mengambil kira contoh ini, mari semak beberapa kemungkinan cara mengendalikannya

Ralat Tersuai

Pengecualian adalah perkara biasa dalam banyak bahasa dan JavaScript termasuk beberapa bahasa yang dipratentukan (seperti SyntaxError). Apabila menangani kemungkinan ralat, amalan yang baik adalah untuk menjadi khusus dan memperibadikannya.

Dalam js untuk mencipta Pengecualian hanya gunakan perkataan reserved throw diikuti dengan apa sahaja yang kita mahu (jika itu cara anda membacanya).

function makeError() {
  throw "Error string"
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Js sangat permisif dalam erti kata itu, namun ia dianggap sebagai amalan buruk untuk membuang sesuatu yang tidak diturunkan daripada kelas Ralat yang terdapat dalam js.

class MyError extends Error {

  constructor(message) {
    super(message);
    this.name = "MyError";
  }
}


function makeError() {
  throw MyError("")
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Seperti yang anda boleh lihat, kelas ralat disertakan dengan sifat yang membolehkan kami menerangkan dengan lebih terperinci mengapa kami mencipta pengecualian (dan kami boleh menambah sifat yang kami inginkan).

Berbalik kepada masalah yang kami kemukakan sebagai contoh. Dengan menggunakan ralat tersuai, kami boleh mengawal perkara yang perlu dilakukan dalam setiap senario.

El código de reserva no existe.
El pago es rechazado.
El código de reserva ya no es válido.
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dengan ini, kami bukan sahaja mendapat kuasa untuk menghalakan aliran dengan cara yang berbeza tetapi kami juga membezakan antara ralat dalaman sistem (contohnya ralat beberapa pergantungan dalaman yang kami gunakan dalam payReservation dll.) daripada apa yang mewakili peraturan perniagaan .

Ini adalah pilihan yang sangat baik, dan ia memenuhi objektif kami untuk mengawal aliran mengikut setiap kes dan jika seseorang melihat fungsi mereka tahu mengapa ia boleh gagal. Dengan itu kita sudah memperoleh banyak, namun terdapat beberapa perkara yang perlu kita pertimbangkan dengan pendekatan ini.

Pengecualian fungsi jika ia tidak dikawal dalam tangkapan pergi ke "tahap yang lebih tinggi". Untuk memberi contoh, jika anda mempunyai fungsi A, yang memanggil B, ini seterusnya memanggil C dan C membuang pengecualian . dikawal ini akan pergi ke B, jika B tidak mengawalnya maka ia berterusan sehingga A dsb. Ini bergantung pada kes anda mungkin berita baik. Mengisytiharkan kemungkinan ralat mengikut peraturan perniagaan mungkin membosankan, kerana semua fungsi perlu disemak untuk kemungkinan pengecualian.

Satu lagi perkara yang perlu diambil kira ialah tamat tempoh pembangun sangat dihargai hari ini. Walaupun alat seperti JsDoc membolehkan anda menerangkan dengan menambah bahawa kaedah mungkin mempunyai pengecualian, editor tidak mengenalinya. Skrip taip sebaliknya tidak mengenali pengecualian tersebut apabila menulis atau memanggil fungsi tersebut.

[] **Prestasi:* pengecualian balingan dan pengendalian mempunyai kesan (minimum) pada prestasi (sama seperti menggunakan pecah). Walaupun dalam persekitaran seperti apl yang kesannya hampir sifar.

Merangkum Ralat dengan nilai Keputusan (atau Sama ada)

Jika kita melihat kes sebelumnya, pengecualian yang kita buat bukan disebabkan oleh ralat "tidak boleh diperbaiki", sebaliknya ia adalah sebahagian daripada peraturan perniagaan. Apabila pengecualian menjadi biasa, mereka berhenti menjadi kes yang benar-benar luar biasa dan direka untuk itu. Daripada membuang pengecualian, kita boleh merangkum status "kejayaan" dan "ralat" dalam satu objek seperti berikut.

No hay conexión a internet. (o el servicio no esta disponible)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Jika kami menggunakan skrip taip (atau d.ts untuk menggunakan jsdoc) kami boleh menentukan jenis seperti ini.

function makeError() {
  throw "Error string"
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Menggunakannya pada contoh kami. Jika sekarang fungsi payReservation kami mengembalikan objek ini dan bukannya pengecualian, menggunakan JSDoc atau Typescript kami boleh menentukan jenis hasil yang boleh kami ambil (mulai sekarang saya akan meletakkan contoh dalam typescript untuk kesederhanaan).
Ini membantu pasukan mengetahui lebih awal apakah ralat yang mungkin dipulangkan oleh fungsi tersebut.

class MyError extends Error {

  constructor(message) {
    super(message);
    this.name = "MyError";
  }
}


function makeError() {
  throw MyError("")
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dengan menggunakan ini, kami memperoleh kelebihan pendekatan dengan pengecualian dan juga, pada masa pembangunan, editor akan menunjukkan maklumat tentang kes "ralat" berbeza yang boleh berlaku.

Malah, konsep jenis ini telah lama wujud dalam pengaturcaraan, dalam banyak bahasa berfungsi mereka tidak mempunyai pengecualian dan mereka menggunakan data jenis ini untuk kesilapan mereka, hari ini banyak bahasa melaksanakannya. Dalam Rust dan Dart, sebagai contoh, kelas Result wujud secara asli, perpustakaan Kotlin's Arrow turut menambahkannya.

Terdapat piawaian tertentu tentang cara menggunakan dan melaksanakan Keputusan, supaya kod kami lebih mudah difahami oleh pembangun baharu yang boleh bergantung pada konvensyen tersebut.

Hasil boleh mewakili keadaan kejayaan atau ralat secara eksklusif (ia tidak boleh kedua-duanya pada masa yang sama), dan membolehkan bekerja dengan kedua-dua keadaan tanpa membuang pengecualian.

El código de reserva no existe.
El pago es rechazado.
El código de reserva ya no es válido.
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Contohnya menggunakan kelas tetapi tidak perlu, terdapat juga pelaksanaan yang lebih mudah, saya mempunyai satu yang biasanya saya bawa ke projek yang saya fikir saya mungkin memerlukannya, saya tinggalkan pautan sekiranya anda mahu melihatnya dan/atau gunakannya.

Jika kita biarkan seperti ini, kita tidak mendapat banyak keuntungan berkaitan dengan objek yang kita cipta sebelum ini. Itulah sebabnya adalah baik untuk mengetahui bahawa ia biasanya melaksanakan lebih banyak kaedah

Sebagai contoh kaedah getOrElse untuk mengembalikan nilai lalai sekiranya berlaku ralat.

No hay conexión a internet. (o el servicio no esta disponible)
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

dan lipat untuk mengendalikan aliran kejayaan/kegagalan secara berfungsi.

function makeError() {
  throw "Error string"
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Anda juga boleh mendapatkan maklumat tentang pengendalian ralat menggunakan Sama ada. Hasilnya ialah Sama ada dengan konteks yang lebih besar, Sama ada mempunyai nilai kanan (kanan) dan kiri (kiri). Seperti dalam bahasa Inggeris kanan juga digunakan untuk mengatakan sesuatu yang betul, ia biasanya mempunyai nilai yang betul manakala ralat di sebelah kiri, tetapi ini tidak semestinya berlaku, hasilnya sebaliknya lebih jelas berhubung dengan di mana ini adalah nilai yang betul dan ralat.

Menggunakannya pada contoh kami, payReservation akan kelihatan seperti ini:

class MyError extends Error {

  constructor(message) {
    super(message);
    this.name = "MyError";
  }
}


function makeError() {
  throw MyError("")
}
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

[*] Amalan yang baik ialah mewujudkan jenis data asas untuk ralat, dalam contoh menggunakan rentetan, tetapi idealnya ia akan mempunyai bentuk yang lebih jelas seperti objek bernama yang mana lebih banyak data boleh ditambah Contohnya, anda boleh melihat contoh ini di sini

Pada pandangan pertama, nampaknya menambah kelas adalah lebih kejuruteraan berlebihan daripada apa-apa lagi. Tetapi Result ialah konsep yang digunakan secara meluas, mengekalkan konvensyen membantu pasukan anda menangkapnya dengan lebih cepat dan merupakan cara yang berkesan untuk mengukuhkan pengendalian ralat anda.

Dengan pilihan ini, kami menerangkan secara eksplisit "ralat" fungsi, kami boleh mengawal aliran aplikasi kami mengikut jenis ralat, kami mendapat bantuan daripada editor semasa memanggil fungsi dan akhirnya kami meninggalkan pengecualian untuk ralat kes dalam sistem.

Walaupun kelebihan ini, beberapa perkara juga mesti diambil kira sebelum melaksanakannya. Seperti yang saya nyatakan pada permulaan bahagian ini, Result adalah asli dalam banyak bahasa tetapi tidak dalam JS, oleh itu dengan melaksanakannya kami menambah abstraksi tambahan. Perkara lain yang perlu diambil kira ialah senario yang kita hadapi, tidak semua aplikasi memerlukan kawalan yang begitu banyak (Pada halaman pendaratan kempen pengiklanan, sebagai contoh, saya tidak akan melihat titik dalam melaksanakan Keputusan). Adalah bernilai menilai sama ada anda boleh memanfaatkan semua potensi atau ia hanya akan menjadi berat tambahan.


Ringkasnya, pengendalian ralat bukan sahaja meningkatkan kualiti kod tetapi juga kerjasama pasukan dengan menyediakan aliran kerja yang boleh diramal dan didokumenkan dengan baik. Pengecualian hasil dan tersuai ialah alatan yang, digunakan dengan baik, menyumbang kepada kod yang lebih boleh diselenggara dan teguh.

Tambahan dalam TS

Dalam TypeScript, kami boleh mengambil manfaat tambahan daripada Result untuk memastikan semua kes ralat dilindungi:

El código de reserva no existe.
El pago es rechazado.
El código de reserva ya no es válido.
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Fungsi typeCheck bertujuan untuk mengesahkan bahawa semua kemungkinan nilai e disemak dalam if/else if.
Dalam repo ini saya tinggalkan sedikit lagi butiran.


Atas ialah kandungan terperinci Mengendalikan ralat dalam Javascript/Typescript: Pengecualian dan Hasil Tersuai. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan