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 throwyaygı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..catchbloklar 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..catchnadir 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 catchyapı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 Promiseveya Promise.resolvebaşlatır try. Aramak throwveya Promise.rejectsizi catchkoda 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..catchiç içe geçebilir. Kişisel authenticate()yöntem içten bir olabilir try..catchbloğ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ç ifkontrol 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.
rejectve 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.