TypeScript Hata İşleme Başlangıç ​​Kılavuzu

Etkili hata işleme her programlama dilinde çok önemlidir ve TypeScript de bir istisna değildir. Uygun hata işleme, beklenmeyen koşulları zarif bir şekilde yöneterek sağlam ve güvenilir uygulamalar oluşturmaya yardımcı olur. Bu kılavuz, TypeScript'te hata işlemenin temellerini ele alacak ve yeni başlayanlar için pratik örnekler sağlayacaktır.

TypeScript'teki Hataları Anlama

TypeScript'teki hatalar, JavaScript'te olduğu gibi, çalışma zamanı veya derleme zamanı sırasında meydana gelir. TypeScript, derleme zamanında birçok olası sorunu yakalayabilen tür güvenliği sağlar, ancak çalışma zamanı hatalarının yine de düzgün bir şekilde yönetilmesi gerekir.

try ve catch ile Temel Hata İşleme

TypeScript'te, try ve catch bloklarını kullanarak çalışma zamanı hatalarını işlersiniz. Bu yaklaşım, bir hata fırlatabilecek kodu yürütmenize ve bu hata oluştuğunda onu işlemenize olanak tanır.

try ve catch örneği

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new Error("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    console.error(error.message);
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Cannot divide by zero

Bu örnekte, divide fonksiyonu iki sayıyı bölmeye çalışır. Eğer bölen sıfırsa, bir hata atılır ve bir hata mesajı kaydeden catch bloğu tarafından yakalanır.

Özel Hata Türleri

TypeScript, belirli hata koşullarını daha iyi temsil etmek için özel hata türleri tanımlamanıza olanak tanır. Özel hata türleri, hataları kategorize etmeye ve bunları daha etkili bir şekilde işlemeye yardımcı olur.

Özel Bir Hata Türü Oluşturma

class DivisionError extends Error {
  constructor(message: string) {
    super(message);
    this.name = "DivisionError";
  }
}

function divide(a: number, b: number): number {
  try {
    if (b === 0) {
      throw new DivisionError("Cannot divide by zero");
    }
    return a / b;
  } catch (error) {
    if (error instanceof DivisionError) {
      console.error(`Custom Error: ${error.message}`);
    } else {
      console.error("An unexpected error occurred");
    }
    return NaN; // Return NaN to indicate an error
  }
}

console.log(divide(10, 2)); // Output: 5
console.log(divide(10, 0)); // Output: Custom Error: Cannot divide by zero

Burada, yerleşik Error sınıfını genişleten özel bir hata sınıfı DivisionError tanımlıyoruz. Daha özel hata işleme sağlamak için bu özel hatayı divide işlevinde kullanıyoruz.

instanceof ile Tip Koruma

instanceof gibi tür koruyucuları, catch bloğundaki bir hata nesnesinin türünü daraltmaya yardımcı olur ve böylece farklı hata türlerini farklı şekilde ele almanızı sağlar.

Tip Koruma Örneği

function processInput(input: string | number) {
  try {
    if (typeof input === "string") {
      console.log(input.toUpperCase());
    } else {
      throw new Error("Input must be a string");
    }
  } catch (error) {
    if (error instanceof Error) {
      console.error(`Error: ${error.message}`);
    } else {
      console.error("An unknown error occurred");
    }
  }
}

processInput("hello"); // Output: HELLO
processInput(42); // Output: Error: Input must be a string

Bu örnek, hata nesnesinin Error örneği olduğundan emin olmak için catch bloğunda tür korumasını gösterir ve böylece doğru hata işleme olanağı sağlar.

Temizleme için finally kullanımı

finally bloğu, bir hata oluşup oluşmadığına bakılmaksızın çalışması gereken kodu yürütmek için kullanılabilir. Bu, dosyaları kapatma veya kaynakları serbest bırakma gibi temizleme işlemleri için yararlıdır.

finally ile örnek

function readFile(filePath: string): string {
  try {
    // Simulate reading a file
    if (filePath === "") {
      throw new Error("File path cannot be empty");
    }
    return "File content";
  } catch (error) {
    console.error(`Error: ${error.message}`);
    return "";
  } finally {
    console.log("Cleanup: Closing file");
  }
}

console.log(readFile("path/to/file")); // Output: File content
console.log(readFile("")); // Output: Error: File path cannot be empty
                            //         Cleanup: Closing file

Bu örnekte, finally bloğu, bir hata oluşup oluşmadığına bakılmaksızın bir temizleme mesajının günlüğe kaydedilmesini sağlar.

Çözüm

Güvenilir TypeScript uygulamaları oluşturmak için etkili hata işleme çok önemlidir. try ve catch, özel hata türleri, tür koruma ve finally kullanarak hataları daha etkili bir şekilde yönetebilir ve uygulamanızın beklenmeyen koşullar karşısında bile öngörülebilir şekilde davranmasını sağlayabilirsiniz.

Bu tekniklerle hataları zarif bir şekilde ele alabilir ve TypeScript kodunuzun sağlamlığını artırabilirsiniz. TypeScript hata işleme konusunda uzmanlaşmak ve daha dayanıklı uygulamalar yazmak için bu kavramları uygulayın.