Javascript ve Typescript'te gelişmiş dene/yakala/nihayet

Try-catch-finally-block'un uygulanmasına ayrıntılı bir göz atın

Javascript ve TypeScript'te hata işleme

Çalışma zamanında bir hata meydana geldiğinde, çoğu programlama dilinde olduğu gibi Javascript ve Typescript'te "atılır". İşlenmeyen atılan hatalar, uygulamanızın veya hizmetinizin çökmesine ve dolayısıyla olası en kötü kullanıcı deneyimine neden olur. Bir hata meydana gelirse, kaydedilmemiş ilerlemeler kaybolur ve kullanıcılar potansiyel olarak uzun bir süreci (örneğin, bir kullanıcı bir çok bilgi sağlayarak bir platforma kaydoluyorsa) baştan başlatabilir. Sonuç olarak, güven kaybolduğu için bu kullanıcılar büyük olasılıkla ürününüzü bir daha asla kullanmayacaklardır.

Bu gibi durumları ele almak için bir hata "yakalanabilir". Javascript ve TypeScript'teki hataları yakalamak için kodunuzu bir "try" bloğuna ve ardından bir "catch" bloğuna sarmanız yeterlidir.

async function getData(){
  try {
    // Call a dummy async 'fetch'-functoin
    const result = await fetch();
    return { result };
  } catch(error) {
    return { error };
  }
}

// ... later in your code ....

const { result, error } = await getData();

if (error){
  // ... handle error case.
}

// Access the results.

Sonuç olarak, hata tüm sisteme yayılmayacak ve bu da çökmeye yol açacaktır, ancak doğrudan kodunuzun kapsamında ele alınacaktır. Uygulama veya hizmet çökmez ve hatayı işlemek için bir azaltma stratejisi uygulanabilir.

“Nihayet” bloğu ile özel kullanım

Hataları işlemek için ek bir adım olarak, Javascript ve Typescript, ek bir "nihayet" anahtar sözcüğü sağlar. Böyle bir "nihai" bloğu, hem "try" bloğu hem de "catch" bloğu yürütüldükten sonra (bir hata meydana gelirse) kendi kapsamındaki herhangi bir kodu yürütür.

// This function is absolutely save
// to call. It fetches some data and 
// optionally catches a potential error.
//
// After everything's done, a 'finally'
// sends the error to our backend for logs,
// if there was any.
async function getData(){
  // In this case, we store the result
  // and error in mutable variables,
  // then return both.
  let result: Result;
  let error: Error;
  
  try {
    // Call a dummy async 'fetch'-function
    result = await fetch();
  } catch(e) {
    error = e;
  } finally {
    // After the whole try/catch has been
    // processed, we can log the error.
    if(error){
      await trackErrorInCloud(error);
    }
  }
  
  return { result, error };
}

// ... same as before ...

Ama bekleyin, dahası var! “Dene” veya “yakala” bloğunda bir sonuç döndürseniz bile “nihayet” bloğunun yürütüldüğünü biliyor muydunuz? İşte bununla ne demek istediğime bir örnek.

// Same as the example before, but
// now we directly return from within
// each code block. And this is where
// a side effect can happen.
async function getData(){
  try {
    const result = await fetch();
    return { result };
  } catch(error) {
    return { error }
  } finally {
    //
    // WATCH OUT!
    //
    // Just for demo purpose, but this
    // line of code will override both
    // the return in 'try' as well as 'catch'!
    //
    // Returning inside of 'finally' is therefore
    // dangerous and will lead to hard-to-debug 
    // issues.
    return { finally: true };
  }
}

// data === { finally: true }
const data = await getData();
// Here's a better use case for
// finally.
async function getData(){
  let error: Error;
  
  try {
    const result = await fetch();
    return { result };
  } catch(e) {
    error = e;
    return { error }
  } finally {
    // No return in finally,
    // so it's safe to use.
    if(error){
      await logInCloud()
    }
  }
}

// if no error === { result: ... }
// if error === { error: ... }
const data = await getData();

Özet

Gördüğünüz gibi, Javascript ve Typescript'teki hataları ele almak oldukça kolaydır ve uygulamanızın tamamen çökmesini önler. "Dene" ve "yakala" bloklarındaki sonuçların döndürülmesinin özel olarak ele alınması, "finally" bloğunu kullanırken bilmek iyidir, ancak kodunuzu bir anti-kalıp stilinde uygulamaktan kaçınmak için kötüye kullanılmamalıdır.

Öneriler

İlgili

Diller