Penggunaan kesalahan dengan benar

155

Saya menggunakan TypeScript untuk proyek yang cukup besar, dan saya bertanya-tanya apa standar untuk penggunaan Errors. Misalnya, saya berikan indeks pengecualian di Jawa:

throw new IndexOutOfBoundsException();

Apakah pernyataan yang setara dalam TypeScript adalah:

throw new Error("Index Out of Bounds");

Cara lain apa yang bisa saya lakukan ini? Apa standar yang diterima?

Nathan Bellowe
sumber

Jawaban:

167

Seseorang memposting tautan ini ke MDN dalam komentar, dan saya pikir itu sangat membantu . Ini menjelaskan hal-hal seperti ErrorTypes dengan sangat teliti.

EvalError --- Membuat instance yang merepresentasikan kesalahan yang terjadi terkait fungsi global eval ().

InternalError --- Membuat instance yang mewakili kesalahan yang terjadi ketika kesalahan internal pada mesin JavaScript dilemparkan. Misalnya "terlalu banyak rekursi".

RangeError --- Membuat instance yang mewakili kesalahan yang terjadi ketika variabel numerik atau parameter berada di luar rentang validnya .

ReferenceError --- Membuat instance yang mewakili kesalahan yang terjadi ketika de-referensi referensi yang tidak valid.

Kesalahan sintaks --- Membuat instance yang mewakili kesalahan sintaksis yang terjadi saat mem-parsing kode dalam eval ().

TypeError --- Membuat instance yang mewakili kesalahan yang terjadi ketika suatu variabel atau parameter bukan tipe yang valid.

URIError --- Membuat instance yang mewakili kesalahan yang terjadi ketika encodeURI () atau decodeURI () diberikan parameter yang tidak valid.

Nathan Bellowe
sumber
Tampaknya tidak ada tipe yang lebih umum untuk argumen yang tidak valid . Tidak semua argumen tidak valid termasuk dalam RangeError. Haruskah Anda mendefinisikan jenis khusus atau adil throw new Error("<message>");?
anddero
58

Konvensi untuk penggunaan di luar jangkauan JavaScript digunakan RangeError. Untuk memeriksa jenisnya gunakan if / else + instanceofmulai dari yang paling spesifik hingga yang paling umum

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}
basarat
sumber
2
Bagaimana dengan kesalahan umum? Dan / atau di mana daftar dibangun di kelas kesalahan JS?
pitosalas
7
Ada daftar jenis kesalahan JavaScript dan informasi lainnya di Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Christian Davén
6
@ Tarasar, saya pikir Anda harus menambahkan di else { throw; }sini
knocte
44

Solusi sederhana untuk memancarkan dan menampilkan pesan dengan Pengecualian.

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

Peringatan

Di atas bukan solusi jika kita tidak tahu jenis kesalahan apa yang dapat dipancarkan dari blok. Dalam kasus semacam itu, penjaga harus digunakan dan penanganan yang tepat untuk kesalahan yang tepat harus dilakukan - lihat jawaban @Martarty.

Maciej Sikora
sumber
Terima kasih atas penunjuk ke konversi tipe eksplisit. Belum menemukan info itu di Script-Documents dan mempelajari sesuatu hari ini.
JackLeEmmerdeur
apakah Anda tahu apa tujuan menambahkan <Error>? e.message berfungsi dengan baik untuk saya.
sbattou
1
@sbattou satu-satunya tujuan <Error>memberi tahu kompiler TS bahwa di esini adalah tipe <Error>sehingga Anda memiliki (1) intellisense dan (2) memeriksa jenis yang lebih baik. Ketahuilah bahwa gips apa pun tidak menerjemahkan ke JS sama sekali dan ini murni gula sintaksis.
Didii
25

Jangan lupa tentang pernyataan pergantian:

  • Pastikan penanganan dengan default.
  • instanceof bisa cocok dengan superclass.
  • ES6 constructorakan cocok dengan kelas yang tepat.
  • Lebih mudah dibaca.

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();

Moriarty
sumber
3
Ini bagus; tampaknya lebih kuat dan lebih bersih daripada jawaban lainnya.
Victor Zamanian