Menu

TypeScript Try Catch: Hata Tipleri ve Özel Hatalar

TypeScript'te hata yönetimi: catch değişkeninin neden unknown olduğu, instanceof Error ile nasıl daraltılacağı, hata fırlatmak, name ve cause içeren özel hata class'ları yazmak ve beklenen hatalar için Result tipi kalıbı.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

TypeScript, JavaScript'in try, catch, finally ve throw yapılarını kullanır. TypeScript'e özgü kısım catch değişkenidir: strict açıkken tipi unknown'dır, bu yüzden kullanmadan önce neyin fırlatıldığını kontrol edersiniz.

Çalışma zamanı tarafı (stack'in nasıl çözüldüğü, hangi yerleşik hata tiplerinin olduğu) JavaScript try/catch sayfasında anlatılır.

catch Değişkeni Neden unknown

JavaScript her şeyi fırlatabilir: bir Error, bir string, bir number, undefined, bir kütüphaneden gelen bir nesne. TypeScript hangisi olduğunu bilemez, bu yüzden strict altında (useUnknownInCatchVariables bayrağı) değişken unknown'dır ve kullanmadan önce onu daraltmanız gerekir:

index.ts(5,34): error TS18046: 'e' is of type 'unknown'.

strict olmadan e, any olur ve aynı kod derlenir, sonra bir string fırlatıldığında çalışma zamanında bozulur: e.message değeri undefined olur ve e.message.length gibi daha derine inen her şey bir TypeError fırlatır. İşaretlemeyle de kurtulamazsınız: catch (e: Error) yazmak TS1196 hatasıdır (Catch clause variable type annotation must be 'any' or 'unknown' if specified).

Hatayı Daraltmak

instanceof Error, TypeError, SyntaxError, RangeError ve kendi alt class'larınız dahil Error üzerine kurulu her şeyi kapsar. Geri kalan her şey için değeri string'e çevirmeye başvurun. Küçük bir yardımcı fonksiyon çağrı yerlerini kısa tutar:

Yalnızca bazı hataları ele alan bir catch, geri kalanını yeniden fırlatmalıdır: if (!(e instanceof ValidationError)) throw e;. Bilinmeyen hataları yutmak gerçek bug'ları gizler.

Hata Fırlatmak

throw her ifadeyi kabul eder ve TypeScript bunu kısıtlamaz. Yine de Error nesneleri fırlatın: bir stack trace taşırlar ve kod tabanındaki her instanceof Error kontrolü buna dayanır.

Her zaman hata fırlatan bir fonksiyonun dönüş tipi never'dır ve TypeScript bunu çağrıdan sonraki daraltma için kullanır:

ES2022'den beri Error, cause içeren ikinci bir argüman alır; bu, alt seviyedeki bir hatayı sizin fırlattığınız hataya bağlar: throw new Error("could not load settings", { cause: e }). Çağıran err.cause değerini okuyabilir (tipi unknown).

Özel Hata Class'ları

Error'ın bir alt class'ı, çağıranların hataları instanceof ile ayırt etmesini ve ek veri taşımasını sağlar. name değerini ayarlayın, çünkü miras alınan değer "Error"'dır ve loglarda ve String(err) çıktısında görünür:

Önce en özel class'ı kontrol edin, çünkü bir NotFoundError aynı zamanda bir HttpError'dır. noImplicitOverride açık değilse override belirteci burada isteğe bağlıdır.

Eski rehberler her hata constructor'ına Object.setPrototypeOf(this, new.target.prototype) ekler. Bu, class'lar ES5 fonksiyonlarına derlendiği ve Error alt class'larında instanceof bozulduğu dönemde gerekliydi. TypeScript 7 artık target: "es5" değerini desteklemez (TS5108: Option 'target=ES5' has been removed bildirir) ve ES2015 ya da sonrasıyla yukarıdaki gibi yerel class ... extends Error çalışır.

Result Kalıbı

TypeScript bir fonksiyonun hangi hataları fırlatabileceğini izlemez, bu yüzden çağıranlara onları ele almalarını hiçbir şey hatırlatmaz. Beklenen başarısızlıklar için (geçersiz girdi, eksik bir kayıt) "başarı ya da başarısızlık" diyen bir değer döndürmek, hatayı tip sisteminin içine taşır:

r.ok kontrol edilmeden r.value okumak bir derleme hatasıdır ve amaç da budur. Beklenmedik durumlar (bug'lar, kopan bir bağlantı) için exception, çağıranın karar vermesi gereken sonuçlar için Result değerleri kullanın.

Async Kodda Hatalar

Reject olan bir promise, await noktasında fırlatılan bir hataya dönüşür; bu yüzden await etrafındaki try/catch aynı şekilde çalışır ve değişken yine unknown'dır. Tek fark bir promise üzerindeki .catch()'tir: callback parametresi unknown değil any olarak tiplenmiştir, bu yüzden onu kendiniz işaretleyin (.catch((e: unknown) => ...)). Örnekler için async/await sayfasına bakın.

Sık Yapılan Hatalar

  • Daraltmadan e.message okumak. strict altında derlenmez; strict olmadan Error olmayan fırlatmalarda bozulur.
  • Her şeyi yakalayıp devam etmek. Beklediğiniz hataları ele alın, geri kalanını yeniden fırlatın.
  • Özel hatalarda name değerini unutmak. O zaman loglar hepsi için Error der.
  • String fırlatmak. throw "failed" bir stack trace taşımaz ve instanceof Error kontrollerinden geçemez.

Sıkça Sorulan Sorular

TypeScript catch bloğundaki hatanın tipi nedir?

strict açıkken (useUnknownInCatchVariables bayrağı) unknown, aksi halde any. JavaScript yalnızca Error nesnelerini değil her değeri fırlatabilir, bu yüzden TypeScript kontrol etmenizi ister. e.message okumadan önce if (e instanceof Error) ile daraltın.

TypeScript'te catch değişkenini Error olarak tipleyebilir miyim?

Hayır. catch (e: Error) yazmak TS1196: Catch clause variable type annotation must be 'any' or 'unknown' if specified hatasıdır. Yalnızca unknown ve any kabul edilir, çünkü neyin fırlatıldığını hiçbir şey garanti etmez. Bunun yerine blok içinde daraltın.

TypeScript'te nasıl hata fırlatırım?

JavaScript'teki gibi: throw new Error("message") ya da new RangeError(...) gibi yerleşik veya özel bir alt class'ın örneği. TypeScript her değeri fırlatmanıza izin verir, ancak Error nesneleri fırlatmak stack trace'i korur ve instanceof Error kontrollerinin çalışmasını sağlar.

TypeScript'te özel bir hata class'ı nasıl oluşturulur?

Error class'ını extend edin, super(message, options) çağırın ve name değerini ayarlayın: class NotFoundError extends Error { name = "NotFoundError"; }. Ek alanlar constructor'a gider. Desteklenen her hedefte (ES2015 ve sonrası) instanceof NotFoundError prototype düzeltmesi olmadan çalışır.

TypeScript'te checked exception ya da throws ifadesi var mı?

Hayır. Bir fonksiyonun tipi ne fırlatabileceği hakkında hiçbir şey söylemez ve derleyici hataların ele alınıp alınmadığını asla kontrol etmez. Çağıranın ele alması beklenen hatalar için onları bir Result tipiyle (başarı ve başarısızlığın discriminated union'ı) değer olarak döndürün; böylece tip sistemi kontrol eder.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA