Haruskah Anda menggunakan try catch di javascript?

Setiap bahasa pemrograman modern memiliki kemampuan untuk menangani dan membuang pengecualian, dan JavaScript tidak terkecuali. Di kolom ini, saya membahas mengapa, bagaimana, dan kapan Anda harus menggunakan pernyataan try catch JavaScript serta melempar kesalahan kustom Anda sendiri

Temukan tambahan. Artikel JavaScript

Try catch dalam bahasa pemrograman apa pun adalah blok di mana kode dapat dieksekusi dengan cara di mana pengecualian dapat terjadi dengan aman dengan cara yang tidak akan mengakibatkan penghentian aplikasi yang tidak normal

Dengan try catch, Anda dapat menangani pengecualian yang mungkin mencakup pembuatan log, mencoba kembali kode yang gagal, atau menghentikan aplikasi dengan baik. Tanpa try catch, Anda berisiko menghadapi pengecualian yang tidak tertangani. Coba tangkap pernyataan tidak gratis karena disertai dengan overhead kinerja. Seperti fitur bahasa lainnya, try catch dapat digunakan secara berlebihan

Catatan. Kolom ini dan kolom lainnya dalam rangkaian ini dimaksudkan untuk memberi warna pada dokumen dan konsep di dalamnya, bukan sebagai duplikasi yang kurang komprehensif dari konten tersebut

Konteks

Berapa kali Anda menggunakan aplikasi dan terjadi kesalahan, mengganggu pekerjaan Anda tanpa peringatan dan tanpa konteks untuk apa yang salah? . Jika Anda beruntung, masalahnya akan teratasi dengan cepat sehingga Anda dapat melanjutkan pekerjaan Anda. Terlalu sering, ada keterlambatan dalam memecahkan masalah karena tim dukungan dan pengembangan kekurangan informasi yang diperlukan untuk mengetahui apa yang terjadi untuk mendiagnosis, memecahkan, dan memperbaiki masalah.

Ironisnya adalah bahwa selama pengembangan, ketika keputusan apakah akan menggunakan try catch dibahas (dengan asumsi diskusi telah dilakukan), seseorang berpendapat bahwa try catch terlalu mahal dari sudut pandang kinerja untuk menjamin penggunaannya. Biasanya, ketika kesimpulan ini dibuat, mereka dibuat tanpa bukti apa pun untuk mendukung kesimpulan tersebut karena argumen kinerja seperti itu dihitung berdasarkan derajat, kemungkinan, atau biaya. Ironisnya, dalam upaya yang semuanya tentang logika, kami akhirnya berurusan dengan banyak keputusan pengembangan yang secara logika sangat cacat. Tiba-tiba, menjadi sangat jelas mengapa ada begitu banyak perangkat lunak yang buruk

Dalam upaya yang semuanya tentang logika, kami sering membuat keputusan pengembangan yang cacat secara logis

Konsep inti

Kolom ini membahas elemen JavaScript berikut

  • mencoba. Dalam blok percobaan, satu atau lebih pernyataan di blok itu dicoba. Blok adalah ruang yang ada di antara kurung kurawal ({}). Setidaknya satu pernyataan catch atau finally harus mengikuti try. Meskipun secara teknis Anda tidak memerlukan pernyataan catch, saya tidak dapat membayangkan mengapa Anda tidak menerapkan setidaknya satu pernyataan catch setelah mencoba karena catch adalah satu-satunya tempat di mana Anda dapat mencegat pengecualian yang dilemparkan. Seperti halnya blok kode apa pun, try dapat berisi blok try catch bersarang
  • menangkap. Jika pengecualian ditemui di blok try, pernyataan catch segera setelah try dipicu. Tangkapan menerima satu parameter, seperti yang ditentukan oleh pernyataan lemparan sebelumnya. Di dalam blok tangkapan, Anda dapat menguji kesalahan tertentu dan mengeksekusi kode secara kondisional untuk kesalahan tersebut
  • akhirnya. Saat menangani pengecualian, Anda mungkin memerlukan kode pembersihan yang dijalankan terlepas dari apakah pengecualian terjadi atau tidak. Kode di blok akhirnya segera setelah blok coba selalu dijalankan
  • melemparkan. Pernyataan lemparan memungkinkan Anda untuk memanggil kesalahan yang ditentukan pengguna. Bergantung pada kriteria yang Anda pilih, Anda memaksa kode panggilan untuk menangani kesalahan
  • Objek kesalahan. Objek Error adalah objek dasar untuk error umum dan untuk banyak tipe error bawaan di JavaScript. Selain itu, Objek Kesalahan dapat diperluas untuk membuat kesalahan yang ditentukan pengguna

Waspadai JavaScript Non-standar

Meskipun ada standar ECMAScript untuk JavaScript, penting untuk mengetahui konteks kode Anda dan fitur non-standar yang mungkin Anda dapatkan. Contoh yang baik adalah pernyataan tangkapan bersyarat

````````````catch(e if e instanceof MyError) {}

Kode ini, yang merupakan cara lain untuk memicu pernyataan catch secara kondisional, bukanlah ECMAScript standar dan mungkin tidak berfungsi di lingkungan tempat kode Anda dieksekusi. Ini adalah fitur yang dibuat oleh Mozilla (FireFox). Karenanya, fitur ini berfungsi di FireFox, tetapi tidak berfungsi di Chrome atau Safari. Inilah yang terkadang membuat JavaScript menantang; . Selain itu, browser yang berbeda dapat menerapkan standar JavaScript (ECMAScript) baru pada waktu yang berbeda

Aplikasi

Pertanyaan dasar yang harus dihadapi adalah kapan Anda harus membungkus kode dalam blok try catch. Salah satu cara untuk menjawab pertanyaan itu adalah dengan mempertimbangkan apa yang bukan try catch. Tujuan try catch bukan untuk memulihkan kode yang buruk. Anti-pola yang umum adalah membungkus kode yang sewaktu-waktu menimbulkan kesalahan karena alasan yang tidak diketahui untuk menerapkan kode perbaikan di blok catch

Contoh kode perbaikan umum mencakup penerapan nilai default untuk variabel. Masalah dengan implementasi try catch ini adalah menutupi apa yang bisa menjadi masalah mendasar yang serius. Sebagai gantinya, try catch harus diterapkan jika terjadi kesalahan. Contohnya termasuk tidak tersedianya layanan eksternal, kredensial login yang tidak valid, input pengguna yang tidak valid, dll. Sebisa mungkin, Anda harus berusaha untuk menangkap kesalahan tertentu. Sebagai penampung-semua, merupakan praktik yang baik untuk memiliki blok tangkapan tanpa syarat sebagai pengaman jika terjadi kesalahan yang tidak Anda antisipasi. Blok tanpa syarat harus selalu menjadi blok tangkapan terakhir dalam pernyataan Anda. Menangkap kesalahan memungkinkan Anda mencatat kesalahan dan, jika mungkin, coba lagi kode sehingga pekerjaan dapat berlanjut. Jika upaya tersebut tidak berhasil, menangkap kesalahan memungkinkan kesalahan ditangani dengan baik dengan cara yang mempertahankan pengalaman pengguna. Contoh berikut menyoroti beberapa pendekatan yang dapat Anda pilih untuk digunakan dalam aplikasi Anda

Contoh berikut bergantung pada kelas sederhana ini

class Result {
    constructor() {
        this.connection = null;
        this.error = null;
    }
}

_

Coba Dasar Tangkap, Akhirnya, dan Lempar

Dalam contoh berikutnya, ada fungsi rintisan yang mencoba membuat koneksi. Untuk tujuan demonstrasi, jika string dengan panjang setidaknya satu tidak disertakan, kesalahan akan terjadi. Dalam semua kasus, turunan dari kelas Hasil dikembalikan. Blok tangkapan dalam contoh ini adalah tangkapan tanpa syarat yang dijalankan untuk kesalahan apa pun. Terlepas dari apakah terjadi kesalahan, blok akhirnya dijalankan

function tryConnection(connString) {
  const result = new Result();
   try {
     if (connString == undefined ||
       connString == null ||
       connString.length == 0)
       throw new Error("You must supply a valid
          connection string.");
      result.connection = connString;
  } catch (e) {
      result.error = e;
  }
    finally {
      return result;
    }
}

Kelas Kesalahan Khusus

Contoh berikut mengilustrasikan kelas kesalahan kustom sederhana. Di konstruktor, panggilan dilakukan ke konstruktor kelas induk

class ConnectionError extends Error {
       constructor(connString) {
   super("There was a connection problem with
          the connection string: " + connString);
   }
}

Dengan kelas kesalahan khusus, Anda sekarang dapat menerapkannya. Berikut ini adalah versi modifikasi dari contoh try catch pertama. Kode yang dimodifikasi berwarna merah. Alih-alih melempar kesalahan umum, kesalahan kustom baru dilemparkan. Di blok tangkapan, ada kode khusus yang menguji jenis kesalahan yang dilemparkan. Untuk kesalahan khusus, string koneksi adalah satu-satunya argumen yang diteruskan

function tryConnection(connString) {
    const result = new Result();
    try {
        if (connString == undefined ||
            connString == null ||
            connString.length == 0)
                  throw new ConnectionError
                    (connString);
        result.connection = connString;
    }
    catch (e) {
              if (e instanceof ConnectionError) {
            console.trace();
            console.log(e);
            // Alternatively, the console trace
            // and log code could hosted in the
            // custom error class.
        }
        result.error = e;
    }
    finally {
       return result;
   }
}

_

Catat Definisi Kesalahan Bawaan JavaScript

JavaScript memiliki sejumlah definisi kesalahan bawaan. Contohnya termasuk RangeError. tanggal dan JSON tidak valid. mengurai. penguraian yang buruk. Kapan pun memungkinkan, gunakan kesalahan bawaan sebelum Anda menginvestasikan upaya untuk membuat kelas kesalahan kustom Anda sendiri

Pengambilan Kunci

Kesalahan adalah fakta kehidupan dalam aplikasi. Masalahnya bukan apakah terjadi kesalahan atau tidak. Sebaliknya, masalahnya adalah bagaimana mereka ditangani. Kuncinya adalah mendapatkan umpan balik sebanyak mungkin untuk menerapkan kode korektif. Kesalahan yang berbeda menuntut solusi yang berbeda. Sebaiknya buat dan terapkan kesalahan khusus yang memperluas kelas kesalahan dasar

Try catch tidak dimaksudkan untuk menjadi alat yang menggantikan kode yang buruk

Menerapkan try catch tidak dimaksudkan sebagai alat untuk memperbaiki kode yang buruk. Jika suatu variabel tidak seharusnya null atau tidak terdefinisi, pastikan untuk melakukan pengujian unit yang mencakup skenario tersebut. Jauh lebih baik untuk memperbaiki masalah di sumbernya dan tepat saat terjadi daripada mencoba mengatasi masalah di hilir saat prospek pemulihan mungkin kurang pasti

Sehubungan dengan manajemen risiko, sebelum menerapkan solusi perbaikan apa pun, Anda harus mengukur biaya relatif. Konteks penting. Tanyakan pada diri Anda apakah satu ons pencegahan (coba tangkap) bernilai satu pon penyembuhan (dukungan setelah fakta yang mahal). Jika kinerja diklaim, ukurlah. Jika Anda tidak melakukan pengujian kinerja, terlepas dari apa yang mungkin Anda pikirkan, kinerja bukanlah prioritas yang sebenarnya. Gunakan coba tangkap ketika ada kemungkinan besar terjadi kesalahan. Skenario kesalahan cenderung masuk ke dalam beberapa kategori yang dapat diprediksi yang melibatkan sumber daya lain yang mungkin tidak tersedia, seperti database, aset cloud, atau apa pun yang memerlukan akses ke sumber daya eksternal

Apakah boleh menggunakan try catch JavaScript?

Pernyataan try-catch harus digunakan kapan pun Anda ingin menyembunyikan kesalahan dari pengguna, atau kapan pun Anda ingin membuat kesalahan ubahsuaian demi keuntungan pengguna. If you haven't figured it out yet, when you execute a try-catch statement, the browser's usual error handling mechanism will be disabled.

Apakah praktik yang baik menggunakan try catch?

Tanpa try catch, Anda berisiko menemui pengecualian yang tidak tertangani. Coba tangkap pernyataan tidak gratis karena datang dengan overhead kinerja. Seperti fitur bahasa lainnya, try catch dapat digunakan secara berlebihan .

Mengapa kita perlu mencoba menangkap di JavaScript?

JavaScript coba dan tangkap . Pernyataan catch memungkinkan Anda untuk menentukan blok kode yang akan dieksekusi, jika terjadi kesalahan pada blok try. allows you to define a block of code to be tested for errors while it is being executed. The catch statement allows you to define a block of code to be executed, if an error occurs in the try block.

Apakah try catch diperlukan?

Ya, Anda dapat memiliki blok try tanpa blok catch dengan menggunakan blok final . Seperti yang kita ketahui, blok terakhir akan selalu dieksekusi meskipun ada pengecualian yang terjadi di blok try, kecuali System.