Skip to content

9. Hatalar ve istisnalar

Image

JavaScript'in çok gelişmiş bir istisna sistemi yoktur. Bununla birlikte, bir hatayı bildirmek için [throw] komutunu ve bu hataları yakalamak için try / catch / finally yapısını sunar.

9.1. [excep-01] komut dosyası

Aşağıdaki komut dosyasında, o anki tarihi [heures:minutes:secondes:millisecondes] biçiminde görüntüleyeceğiz. Bunu yapmak için, jS adlı bir kütüphaneyi kullanacağız. Bu kütüphaneyi, her zamanki gibi [npm] aracıyla kuracağız:

Image

Komut dosyasının kodu şöyledir:


'use strict';

// moment paketi
import moment from 'moment';

...
  1. satırdaki [import] satırının nasıl yazıldığını öğrenmek için [moment] modülünün tanımına bakabiliriz:

Image

  • [1-2]'te modül tanımına gidilir;
  • [3]'te bir Typescript dosyası vardır, Javascript değil. Çalıştırma sırasında bu Typescript dosyası, kullanılmadan önce bir Javascript dosyasına derlenir;
  • [4]'te, [export] komutlarını arıyoruz (Ctrl-F);
  • [5]'te, komut [moment] nesnesini dışa aktarır. Bu nesne, aşağıdaki şekilde ES6'e içe aktarılabilir:

import moment from 'moment';

[moment] nesnesini içe aktarmak için herhangi bir ad kullanılabilir, örneğin:


import m from 'moment';

Şimdi komut dosyasının koduna geri dönelim:


'use strict';

// moment paketi
import moment from 'moment';

// try / catch / finally ilkesi
for (let i = 0; i < 10; i++) {
  // geçerli tarih ve saat
  const now = Date.now();
  // milisaniyeleri elde etmek için saat biçimlendirme
  const time = moment(now).format("HH:mm:ss:SSS");
  // milisaniyeler
  const milli = Number(time.substr(time.length - 3));
  // görüntüleme
  console.log("--------------------itération n° ", i, "à", time);
  try {
    // anlık saate göre değişen sayı
    const nbre = milli % 2;
    if (nbre === 0) {
      // hata mesajı gönder
      throw "erreur";
    }
    // buraya gelindiğine göre hata olmamıştır
    console.log("pas d'erreur");
  } catch (error) {
    // buraya gelindiğine göre bir hata oluşmuştur
    console.log("erreur1=", error);
  } finally {
    // hata olsun ya da olmasın her durumda çalıştırılır
    console.log("finally")
  }
}

Yorumlar

  • 4. satır: [moment] kütüphanesinin içe aktarılması;
  • komut dosyasının çalışma prensibi 10 kez döngüye girmektir (7. satır). Her döngüde, o anki saat [heures:minutes:secondes:millisecondes] biçiminde alınır (8-13. satırlar);
  • milisaniye sayısı çift ise, bir hata mesajı görüntülenir (satır 19-22);
  • burada try / catch / finally yapısının nasıl çalıştığını anlamak önemlidir

Çalıştırma


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-01.js"
--------------------itération n° 0 à 17:57:04:440
erreur1= erreur
finally
--------------------itération n° 1 à 17:57:04:447
pas d'erreur
finally
--------------------itération n° 2 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 3 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 4 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 5 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 6 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 7 à 17:57:04:448
erreur1= erreur
finally
--------------------itération n° 8 à 17:57:04:449
pas d'erreur
finally
--------------------itération n° 9 à 17:57:04:449
pas d'erreur
finally

Görüldüğü gibi, hata olsun ya da olmasın [finally] bloğu her zaman yürütülür.

9.2. [excep-02] komut dosyası

[throw] komutunun herhangi bir veri türünü başlatabileceği ve bu verinin [catch] cümlesi tarafından tamamen alınabileceği görülmektedir.


'use strict';

// hata bildirmek için hemen hemen her şeyi "atabiliriz" (throw)
let i = 0;
console.log("--------------------essai n° ", i);
// bir karakter dizisi atmak
try {
  throw "msg d'erreur";
} catch (error) {
  // bir hata oluştu
  console.log("erreur=[", error, "], type=", typeof (error));
}
// bir tablo oluştur
i++;
console.log("--------------------essai n° ", i);
try {
  throw [1, 2, 3]
} catch (error) {
  // bir hata oluştu
  console.log("erreur=[", error, "], type=", typeof (error));
}
// bir literal nesne başlat
i++;
console.log("--------------------essai n° ", i);
try {
  throw { nom: "hercule", pays: "grèce antique" }
} catch (error) {
  // hata oluştu
  console.log("erreur=[", error, "], type=", typeof (error));
}
// Error türünü başlatma
i++;
console.log("--------------------essai n° ", i);
try {
  throw new Error("erreur de connexion au réseau");
} catch (error) {
  // hata oluştu
  console.log("erreur=[", error, "], type=", typeof (error));
}
// Error türü atılıyor
i++;
console.log("--------------------essai n° ", i);
try {
  throw new Error("erreur de connexion au réseau");
} catch (error) {
  // hata oluştu - mesaj [error.message]'te yer alıyor
  console.log("erreur.message=[", error.message, "], type(error)=", typeof (error));
}

Açıklamalar

  • 35. ve 44. satırlar: [Error], oluşturucusunun isteğe bağlı ilk parametre olarak bir hata mesajı kabul eden bir JavaScript sınıfıdır. Bu mesaj, [Error.message] özelliğinden (47. satır) alınabilir;
  • Hata bildirmek için [Error] dışında başka sınıflar da mevcuttur: [EvalError, InternalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError);

Çalıştırma


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-02.js"
--------------------essai n° 0
erreur=[ msg d'erreur ], type= string
--------------------essai n° 1
erreur=[ [ 1, 2, 3 ] ], type= object
--------------------essai n° 2
erreur=[ { nom: 'hercule', pays: 'grèce antique' } ], type= object
--------------------essai n° 3
erreur=[ Error: erreur de connexion au réseau
at Object.<anonymous> (c:\Data\st-2019\dev\es6\javascript\exceptions\excep-02.js:35:9)
at Object.<anonymous> (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:251206)
at c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:245054
at Generator.next (<anonymous>)
at bl (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:245412)
at kl (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:247659)
at Object.u (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:287740)
at Object.o (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:287137)
at Object.<anonymous> (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:284879)
at Object.apply (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:199341) ], type= object
--------------------essai n° 4
erreur.message=[ erreur de connexion au réseau ], type(error)= object

9.3. [excep-03] komut dosyası

Bu komut dosyası, bir [catch] içinde, [catch] tarafından yakalanan [Error] örneğinin türünü ayırt edebileceğimizi göstermektedir:


''use strict';

// moment paketi
import moment from 'moment';

// alınan Error örneğini [catch] içinde ayırt etme
for (let i = 0; i < 10; i++) {
  // geçerli anın tarihi ve saati
  const now = Date.now();
  // milisaniyeleri elde etmek için saat biçimlendirme
  const time = moment(now).format("HH:mm:ss:SSS");
  // milisaniyeler
  const milli = Number(time.substr(time.length - 3));
  console.log("--------------------itération n° ", i);
  try {
    // sayı [0, 1, 2]
    const nbre = milli % 3;
    switch (nbre) {
      case 0:
        throw new ReferenceError("erreur 1");
      case 1:
        throw new RangeError("erreur 2");
      default:
        throw new EvalError("erreur 3");
    }
  } catch (error) {
    // hata oluştu
    if (error instanceof ReferenceError) {
      console.log("ReferenceError :", error.message);
    } else {
      if (error instanceof RangeError) {
        console.log("RangeError :", error.message);
      }
      else {
        if (error instanceof EvalError) {
          console.log("EvalError :", error.message);
        }
      }
    }
  }
}

Çalıştırma


[Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-03.js"
--------------------itération n° 0
ReferenceError : erreur 1
--------------------itération n° 1
RangeError : erreur 2
--------------------itération n° 2
RangeError : erreur 2
--------------------itération n° 3
RangeError : erreur 2
--------------------itération n° 4
RangeError : erreur 2
--------------------itération n° 5
RangeError : erreur 2
--------------------itération n° 6
EvalError : erreur 3
--------------------itération n° 7
EvalError : erreur 3
--------------------itération n° 8
EvalError : erreur 3
--------------------itération n° 9
EvalError : erreur 3