Hataların uygun kullanımı


155

Oldukça büyük bir proje için TypeScript kullanıyorum ve Errors kullanımı için standart nedir merak ediyorum . Örneğin, Java'da sınırlar dışında özel durum içeren bir dizin sağladığımı varsayalım:

throw new IndexOutOfBoundsException();

TypeScript'teki eşdeğer ifade şöyle olur:

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

Bunu başka hangi yollarla yapabilirim? Kabul edilen standart nedir?

Yanıtlar:


167

Birisi MDN'ye bu bağlantıyı bir yorumda gönderdi ve bence çok yardımcı oldu . ErrorTypes gibi şeyleri çok ayrıntılı olarak açıklar.

EvalError --- global işlevi eval () ile ilgili bir hatayı temsil eden bir örnek oluşturur.

InternalError --- JavaScript motorunda dahili bir hata atıldığında oluşan bir hatayı temsil eden bir örnek oluşturur. Örneğin "çok fazla özyineleme".

RangeError --- Sayısal bir değişken veya parametre geçerli aralığının dışında olduğunda oluşan bir hatayı temsil eden bir örnek oluşturur.

ReferenceError --- Geçersiz bir başvurunun referansı kaldırılırken oluşan bir hatayı temsil eden bir örnek oluşturur.

SyntaxError --- eval () içinde kod ayrıştırılırken oluşan bir sözdizimi hatasını temsil eden bir örnek oluşturur.

TypeError --- Bir değişken veya parametre geçerli türde olmadığında oluşan bir hatayı temsil eden bir örnek oluşturur.

URIError --- encodeURI () veya decodeURI () geçersiz parametreler iletildiğinde oluşan bir hatayı temsil eden bir örnek oluşturur.


Geçersiz argüman için daha genel bir tür eksik gibi görünüyor . Tüm geçersiz argümanlar geçerli değildir RangeError. Özel türler tanımlamalı throw new Error("<message>");mısınız yoksa sadece ?
anddero

58

JavaScript'te kapsam dışı için kural kullanılıyor RangeError. Türü kontrol etmek için if / else + instanceofen genele en genel olandan başlayarak kullanın

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
Genel bir hataya ne dersiniz? Ve / veya yerleşik JS hata sınıflarının listesi nerede?
pitosalas

7
Mozilla Developer Network'te JavaScript hata türlerinin ve diğer bilgilerin bir listesi vardır: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Christian Davén

6
@basarat Sanırım else { throw; }buraya eklemelisin
knocte

44

İstisna ile mesaj göndermek ve göstermek için basit bir çözüm.

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

Dikkat

Bloktan ne tür bir hata yayılabileceğini bilmiyorsak, yukarıdaki bir çözüm değildir. Bu gibi durumlarda tip muhafızları kullanılmalı ve uygun hata için doğru kullanım yapılmalıdır - @Moriarty cevabına bakınız.


Açık tip dönüşüm işaretçisi için teşekkürler. Bu bilgiyi Typcript-Docs'ta bulamadık ve bugün bir şeyler öğrendim.
JackLeEmmerdeur

<Error> eklemenin amacının ne olduğunu biliyor musunuz? e.message benim için iyi çalışıyor.
sbattou

1
@sbattou'nun tek amacı <Error>TS derleyicisine eburada tip olduğunu söylemektir, <Error>böylece (1) intellisense ve (2) daha iyi tip kontrolüne sahip olursunuz. Ancak herhangi bir dökümün JS'ye hiç dönüşmediğini ve tamamen sözdizimsel şeker olduğunu unutmayın.
Didii

25

Anahtar ifadelerini unutmayın:

  • İle kullanımdan emin olun default.
  • instanceof Üst sınıfta eşleşebilir.
  • ES6 constructor, tam sınıfla eşleşecektir.
  • Daha kolay okunur.

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();


3
Bu harika; diğer cevaplardan daha sağlam ve temiz görünüyor.
Victor Zamanian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.