Hatalar
Hatalardan bahsedelim.
İki tür hata vardır:
- beklenen hatalar
- beklenmeyen hatalar
- tek tek hatalar
Beklenen Hatalar
Beklenen hatalar, yanlış şeyin gerçekleştiği durumlardır ancak bunun olabileceğini biliyorsunuzdur, bu yüzden başa çıkacaksınız.
Bunlar kullanıcı girişi veya sunucu istekleri gibi şeylerdir. Kullanıcının bir hata yapabileceğini veya sunucunun kapalı olabileceğini biliyorsunuz, bu nedenle programın tekrar giriş yapmasını istediğinden veya bir mesaj görüntülediğinden veya uygun olan diğer davranışlardan emin olmak için bazı kontrol kodları yazıyorsunuz.
Bunlar, ele alındığında kurtarılabilir. Taşınırsa, beklenmeyen hatalar ortaya çıkar.
Beklenmeyen Hatalar
Beklenmeyen hatalar (hatalar), kod yanlış olduğu için yanlış şeyin gerçekleştiği durumlardır. Sonunda gerçekleşeceklerini biliyorsunuz, ancak onlarla nasıl veya nasıl başa çıkacaklarını bilmenin bir yolu yok, çünkü, tanımı gereği beklenmedikler.
Bunlar, sözdizimi ve mantık hataları gibi şeylerdir. Kodunuzda bir yazım hatası olabilir, yanlış parametrelerle bir işlev çağırmış olabilirsiniz. Bunlar tipik olarak kurtarılamaz.
try..catch
Hakkında konuşalım try..catch
.
JavaScript’te throw
yaygın olarak kullanılmaz. Kod içindeki örneklere bakarsanız, aralarında çok az ve çok olacak ve genellikle satırları boyunca yapılandırılmış olacaklardır.
function example(param) {
if (!Array.isArray(param) {
throw new TypeError('"param" should be an array!');
}
...
}
Bu nedenle, try..catch
bloklar da kontrol akışı için o kadar yaygın değildir. Beklenen hataları önlemek için yöntemleri çağırmadan önce bazı kontrolleri eklemek genellikle oldukça kolaydır.
JavaScript ortamları da oldukça affedilir, bu yüzden beklenmeyen hatalar çoğu zaman yakalanmamış kalır.
try..catch
nadir olmak zorunda değildir. Java ve C # gibi dillerde daha yaygın olan bazı hoş kullanım durumları vardır. Java ve C #, yazılan catch
yapıların avantajına sahiptir ; böylece beklenen ve beklenmeyen hatalar arasında ayrım yapabilirsiniz:
C # :
try
{
var example = DoSomething();
}
catch (ExpectedException e)
{
DoSomethingElse(e);
}
Bu örnek, diğer beklenmeyen istisnaların başka bir yere akmasını ve başka yerlerde kullanılmasını sağlar (örneğin, günlüğe kaydedilerek ve programdan kapatılarak).
JavaScript'te, bu yapı şununla kopyalanabilir:
try {
let example = doSomething();
} catch (e) {
if (e instanceOf ExpectedError) {
DoSomethingElse(e);
} else {
throw e;
}
}
Bu kadar zarif değil, bu da nadir olmasının nedeninin bir parçası.
Fonksiyonlar
Fonksiyonlar hakkında konuşalım.
Eğer kullanırsanız tek bir sorumluluk ilkesini , her sınıf ve işlev tekil bir amaca hizmet etmelidir.
Örneğin, authenticate()
bir kullanıcının kimliğini doğrulayabilir.
Bu şöyle yazılabilir:
const user = authenticate();
if (user == null) {
// keep doing stuff
} else {
// handle expected error
}
Alternatif olarak şu şekilde yazılabilir:
try {
const user = authenticate();
// keep doing stuff
} catch (e) {
if (e instanceOf AuthenticationError) {
// handle expected error
} else {
throw e;
}
}
Her ikisi de kabul edilebilir.
sözler
Hadi sözler hakkında konuşalım.
Sözler eşzamansız bir şeklidir try..catch
. Kodunuzu arayın new Promise
veya Promise.resolve
başlatır try
. Aramak throw
veya Promise.reject
sizi catch
koda gönderir .
Promise.resolve(value) // try
.then(doSomething) // try
.then(doSomethingElse) // try
.catch(handleError) // catch
Bir kullanıcının kimliğini doğrulamak için eşzamansız bir işleve sahipseniz, şu şekilde yazabilirsiniz:
authenticate()
.then((user) => {
if (user == null) {
// keep doing stuff
} else {
// handle expected error
}
});
Alternatif olarak şu şekilde yazılabilir:
authenticate()
.then((user) => {
// keep doing stuff
})
.catch((e) => {
if (e instanceOf AuthenticationError) {
// handle expected error
} else {
throw e;
}
});
Her ikisi de kabul edilebilir.
yuvalama
Yuvalama hakkında konuşalım.
try..catch
iç içe geçebilir. Kişisel authenticate()
yöntem içten bir olabilir try..catch
bloğu gibi:
try {
const credentials = requestCredentialsFromUser();
const user = getUserFromServer(credentials);
} catch (e) {
if (e instanceOf CredentialsError) {
// handle failure to request credentials
} else if (e instanceOf ServerError) {
// handle failure to get data from server
} else {
throw e; // no idea what happened
}
}
Aynı şekilde sözler yuvalanabilir. Zaman uyumsuz authenticate()
yönteminiz dahili olarak vaatlerde bulunabilir:
requestCredentialsFromUser()
.then(getUserFromServer)
.catch((e) => {
if (e instanceOf CredentialsError) {
// handle failure to request credentials
} else if (e instanceOf ServerError) {
// handle failure to get data from server
} else {
throw e; // no idea what happened
}
});
Peki cevap ne?
Tamam, sanırım şu soruya cevap vermenin zamanı geldi:
Kimlik doğrulamadaki bir başarısızlık söz vermeyi reddedeceğiniz bir şey midir?
Verebileceğim en basit cevap throw
, senkronize kod olsaydı istisna yapmak istediğiniz herhangi bir yerde bir söz vermeyi reddetmeniz gerektiğidir .
Kontrol akışınız ifadelerinizde birkaç if
kontrol yaparak daha basitse then
, söz vermeyi reddetmenize gerek yoktur.
Kontrol akışınız bir söz vermeyi reddederek ve ardından hata işleme kodunuzdaki hata türlerini kontrol ederek daha basitse, bunu yapın.
reject
ve yanlış döndürmez, ancak bir olmaya değer bekliyoruzBool
, o zaman vardı başarılı ve değeri ne olursa olsun Bool ile çözmelidir. Sözler, değerler için bir tür vekildir - döndürülen değeri saklarlar, bu nedenle, eğer değer siz elde edilemezsereject
. Aksi takdirde yapmalısınresolve
.