Skip to content

Commit 1ba271c

Browse files
authored
Merge pull request #350 from utqkaba/utq
Hata Yönetimi, "try...catch"
2 parents 0f208b7 + 52c5546 commit 1ba271c

File tree

1 file changed

+77
-77
lines changed

1 file changed

+77
-77
lines changed

1-js/10-error-handling/1-try-catch/article.md

Lines changed: 77 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
# Hataları idare etme, "try...catch"
1+
# Hata Yönetimi, "try...catch"
22

3-
Programlarken ne kadar mükemmel olmaya çalışsak da bazen kodumuzda hatalar olabilir. Bu bizim hatalarımızdan dolayı olabileceği gibi, kullanıcı girişlerinden, beklenmeyen server cevaplarından veya binlerce farklı nedenden dolayı oluşabilir.
3+
Programlama konusunda ne kadar iyi olursak olalım, bazen kodlarımızda hatalar olabilir. Bu hatalar bizim hatalarımızdan, beklenmedik bir kullanıcı girdisinden, hatalı bir sunucu yanıtından ve daha binlerce nedenden kaynaklanabilir.
44

55
Genelde kodda bir hata olduğunda yazdığımız kod bir adım ileriye gidemeden sona erer ve konsola bunun nedenini yazar.
66

7-
Hataları "yakalamak" için "try...catch" kullanarak doğrudan kodun ölmesine aman vermek yerine daha mantıklı şeyler yaptırabiliriz.
7+
Ancak try...catch sözdizimi yapısı hataları "yakalamamızı" sağlar, böylece kodun ölmesi yerine daha makul bir şey yaptırabiliriz.
88

99
[cut]
1010

@@ -14,17 +14,13 @@ Hataları "yakalamak" için "try...catch" kullanarak doğrudan kodun ölmesine a
1414

1515
```js
1616
try {
17-
1817
// kod...
19-
2018
} catch (err) {
21-
22-
// hataları idare et.
23-
19+
// hata yönetimi.
2420
}
2521
```
2622

27-
Çalışması aşağıdaki gibidir:
23+
Şu şekilde çalışır:
2824

2925
1. Önce `try {...}` içerisindekiler çalıştırılır.
3026
2. Eğer hata yoksa `catch(err)` görmezden gelinir: çalışma try'ın sonuna ulaşır ve sonra `catch`'i atlar.
@@ -34,54 +30,47 @@ try {
3430

3531
Öyleyse `try {...}` içerisindeki kod doğrudan sona eremez, bize `catch` içerisinde bunu idare etmemiz için olanak sağlar.
3632

37-
Birkaç örnek ile daha da pekiştirelim:
38-
39-
40-
- Hatasız örnek: `alert` `(1)` ve `(2)`'yi gösterir:
33+
Birkaç örnek inceleyelim.
4134

42-
```js run
43-
try {
35+
- Hatasız örnek: `alert` `(1)` ve `(2)`'yi gösterir:
4436

45-
alert('try başladı'); // *!*(1) <--*/!*
46-
47-
// ...no errors here
48-
49-
alert('try bitti'); // *!*(2) <--*/!*
50-
51-
} catch(err) {
37+
```js run
38+
try {
39+
alert("try başladı"); // *!*(1) <--*/!*
5240

53-
alert('Catch görmezden gelindi çünkü bir hata meydana gelmedi.'); // (3)
41+
// ...no errors here
5442

55-
}
43+
alert("try bitti"); // *!*(2) <--*/!*
44+
} catch (err) {
45+
alert("Catch görmezden gelindi çünkü bir hata meydana gelmedi."); // (3)
46+
}
5647

57-
alert("...Kod normal çalışmasına devam etti.");
58-
```
48+
alert("...Kod normal çalışmasına devam etti.");
49+
```
5950

6051
- Hatalı örnek: `(1)` ve `(3)`'ü gösterir:
6152

62-
```js run
63-
try {
64-
65-
alert('try başladı'); // *!*(1) <--*/!*
53+
```js run
54+
try {
6655

67-
*!*
68-
lalala; // hata, değişken tanımlı değil!
69-
*/!*
56+
alert('try başladı'); // *!*(1) <--*/!*
7057

71-
alert('try bitti (hiç erişilemedi)'); // (2)
58+
*!*
59+
lalala; // hata, değişken tanımlı değil!
60+
*/!*
7261

73-
} catch(err) {
62+
alert('try bitti (Hiç erişilemedi)'); // (2)
7463

75-
alert(`Hata meydana geldi!`); // *!*(3) <--*/!*
64+
} catch(err) {
7665

77-
}
66+
alert(`Hata meydana geldi!`); // *!*(3) <--*/!*
7867

79-
alert("...Kod normal çalışmasına devam etti.");
80-
```
68+
}
8169

70+
alert("...Kod normal çalışmasına devam etti.");
71+
```
8272

83-
````warn header="`try...catch` sadece çalışma zamanlı hatalar içindir"
84-
`try...catch`'in çalışabilmesi için kod çalışabilir olmalıdır. Diğer bir deyişle geçerli bir JavaScript kodu olmalıdır.
73+
````warn header="`try...catch`sadece çalışma zamanlı hatalar içindir"`try...catch`'in çalışabilmesi için kod çalışabilir olmalıdır. Diğer bir deyişle geçerli bir JavaScript kodu olmalıdır.
8574

8675
Eğer kod yazımsal olarak hatalıysa çalışmayacaktır, örneğin süslü parantezler açılmış ama kapatılmamışsa:
8776

@@ -93,10 +82,11 @@ try {
9382
}
9483
```
9584
96-
JavaScript motoru önce kodu okur, sonra çalıştırır. Eğer hata okuma safhasında meydana gelirse bunlara "ayrıştırma-zamanı" hataları denir ve kurtarılamaz hatalardır. Bundan dolayı JavaScript motoru bunları anlayamaz.
85+
JavaScript motoru önce kodu okur, sonra çalıştırır. Eğer hata okuma aşamasında meydana gelirse bunlara "ayrıştırma-zamanı" hataları denir ve kurtarılamaz hatalardır. Bundan dolayı JavaScript motoru bunları anlayamaz.
9786
9887
Bundan dolayı `try...catch` ancak ve ancak geçerli kodlarda oluşacak hataları idare edebilir. Bu hatalara "çalışma zamanı hataları" veya bazen "istisnalar" (exception) denilmektedir.
99-
````
88+
89+
`````
10090

10191

10292
````warn header="`try...catch` Senkronize olarak çalışmaktadır"
@@ -117,14 +107,14 @@ Eğer zamanlanmış fonksiyon içerisinde bu hatayı yakalamak istiyorsanız, `t
117107

118108
```js run
119109
setTimeout(function() {
120-
try {
110+
try {
121111
noSuchVariable; // try...catch hataları yakalayacaktır.
122112
} catch (e) {
123113
alert( "hata burada yakalandı!" );
124114
}
125115
}, 1000);
126116
```
127-
````
117+
`````
128118
129119
## Hata Objesi
130120
@@ -133,10 +123,12 @@ Hata meydana geldiğinde, JavaScript bu hata ile ilgili bir obje yaratır. Sonra
133123
```js
134124
try {
135125
// ...
136-
} catch(err) { // <-- the "error object", could use another word instead of err
126+
} catch (err) {
127+
// <-- the "error object", could use another word instead of err
137128
// ...
138129
}
139130
```
131+
140132
Tüm varsayılan hatalar için, `catch` içerisinde hata objesi iki ana özelliği taşır:
141133
142134
`isim` (name)
@@ -168,7 +160,6 @@ try {
168160
}
169161
```
170162
171-
172163
## `try...catch` kullanımı
173164
174165
Gerçek hayatta `try...catch`'in nasıl kullanılabileceğine bakalım.
@@ -190,6 +181,7 @@ let user = JSON.parse(json); // bu veriyi JS objesine dönüştür.
190181
alert( user.name ); // John
191182
alert( user.age ); // 30
192183
```
184+
193185
JSON hakkında daha derin bilgiyi <info:json> bölümünden öğrenebilirsiniz.
194186
195187
**Eğer `json` düzgün gelmiyorsa `JSON.parse` hata üretir ve kod anında "ölür".**
@@ -213,12 +205,13 @@ try {
213205
} catch (e) {
214206
*!*
215207
// ...çalışma buradan devam eder.
216-
alert( "Kusura bakmayın, veride hata var.Talep tekrar yapacaktır" );
208+
alert( "Kusura bakmayın, veride hata var. Talep tekrar yapacaktır" );
217209
alert( e.name );
218210
alert( e.message );
219211
*/!*
220212
}
221213
```
214+
222215
Burada `catch` bloğu sadece mesajı göstermek için kullanılmıştır. Fakat burada ağ talebi, kullanıcıya başka bir yöntem sunma, loglama için hata loginin tutulması gibi işlemler yapılabilir.
223216
224217
## Kendi hatalarımızı atma
@@ -241,6 +234,7 @@ try {
241234
alert( "çalışmaz" );
242235
}
243236
```
237+
244238
Burada `JSON.parse` doğru bir şekilde çalışır, `"name"`'in olmaması aslında bir sorundur.
245239
246240
Hata idaresini birleştirmek adına burada `throw` operatörü kullanılacaktır.
@@ -254,6 +248,7 @@ Yazımı şu şekildedir:
254248
```js
255249
throw <error object>
256250
```
251+
257252
Teknik olarak her şeyi hata objesi olarak kullanmak mümkündür. Hatta bu ilkel tipler olan sayı, karakter dizisi gibi yapılar da olabilir. Fakat obje kullanmak, daha sı `name` ve `message` özelliklerine sahip obje kullanmak daha iyidir. ( Böylece gömülü gelen hatalar ile uyumlu olacaktır.)
258253
259254
JavaScript birçok standart hataya sahiptir:`Error`, `SyntaxError`, `ReferenceError`, `TypeError` vs. Bunları kullanarak da hata objesi yaratmak mümkündür.
@@ -278,6 +273,7 @@ let error = new Error("Bir şeyler oldu o_O");
278273
alert(error.name); // Error
279274
alert(error.message); // Bir şeyler oldu o_O
280275
```
276+
281277
`JSON.parse` ne tarz hatalar üretti bakalım:
282278
283279
```js run
@@ -293,7 +289,7 @@ try {
293289
294290
Gördüğünüz gibi bu `SyntaxError` yani yazım yanlışıdır.
295291
296-
Bizim durumumuzda ise `name`'in olmaması yazım hatası olarak tanımlanabilir.
292+
Bizim durumumuzda ise `name`'in olmaması yazım hatası olarak tanımlanabilir.
297293
Bunu isimsiz öğretmen olmayacağından yazım hatası olarak tanımlayabilir.
298294
299295
Atacak olursak:
@@ -335,14 +331,15 @@ try {
335331
user = JSON.parse(json); // <-- user'dan önce "let" kullanmayı unuttuysak
336332

337333
// ...
338-
} catch(err) {
334+
} catch (err) {
339335
alert("JSON Error: " + err); // JSON Error: ReferenceError: user is not defined
340336
// (hata aslında JSON ile alakalı değil)
341337
}
342338
```
339+
343340
Tabii ki her şey mümkün! Programcılar da hata yapar. Yıllardır milyonlarca kişinin kullandığı open-source projelerde bile hata vardır. Hatta öyle hatalar vardır ki bulunduğunda çok büyük belaya neden olabilir (`ssh`'ta bulunan hata).
344341
345-
Biz denemelerimizde `try...catch`i "doğru olmayan veri"yi yakalamak için kullandık. Fakat aslında `catch` `try`'da olabilecek *tüm* hataları alır. Yukarıdaki örnekte beklenmeyen bir hata alır ancak yine de`"JSON Error" mesajı verir. Bu aslında kod ayıklamayı zorlaştıran bir şeydir ve yanlış kullanımdır.
342+
Biz denemelerimizde `try...catch`i "doğru olmayan veri"yi yakalamak için kullandık. Fakat aslında `catch` `try`'da olabilecek _tüm_ hataları alır. Yukarıdaki örnekte beklenmeyen bir hata alır ancak yine de`"JSON Error" mesajı verir. Bu aslında kod ayıklamayı zorlaştıran bir şeydir ve yanlış kullanımdır.
346343

347344
Yine de ne hatası olduğunu `name`'den çıkarmak mümkündür.
348345
@@ -396,6 +393,7 @@ try {
396393
397394
}
398395
```
396+
399397
`try...catch` içerisinde eğer `(*)` hata tekrar atılırsa bu, `try...catch` in dışına taşar. Bunun daha üstte bulunan başka bir `try...catch` tarafından yakalanması gerekmektedir. Böyle bir ihtimal yoksa kod burada sona ermelidir.
400398

401399
Böylece `catch` bloğu aslında sadece bildiği hataları idare eder ve diğerlerini hiç kontrol etmeden paslar diyebiliriz.
@@ -429,6 +427,7 @@ try {
429427
*/!*
430428
}
431429
```
430+
432431
Burada `readData` sadece `SyntaxError` ile nasıl başa çıkacağını biliyor. Bunun yanında dıştaki `try...catch` ise geri kalan her şeyi idare ediyor.
433432

434433
## try...catch...finally
@@ -458,12 +457,12 @@ Aşağıdaki kodu çalıştırmayı deneyiniz:
458457

459458
```js run
460459
try {
461-
alert( 'try' );
462-
if (confirm('Make an error?')) BAD_CODE();
460+
alert("try");
461+
if (confirm("Make an error?")) BAD_CODE();
463462
} catch (e) {
464-
alert( 'catch' );
463+
alert("catch");
465464
} finally {
466-
alert( 'finally' );
465+
alert("finally");
467466
}
468467
```
469468

@@ -478,7 +477,7 @@ Kod iki türlü çalışabilir:
478477
479478
`finally` ne olursa olsun süre ölçmeyi sonlandırmak için harika bir yerdir.
480479
481-
Aşağıda `finally` düzgün veya yanlış çalışan `fib` fonksiyonunun ne kadar sürdüğünü doğru olarak hesaplamamızı sağlar.
480+
Aşağıda `finally` düzgün veya yanlış çalışan `fib` fonksiyonunun ne kadar sürdüğünü doğru olarak hesaplamamızı sağlar.
482481
483482
```js run
484483
let num = +prompt("Enter a positive integer number?", 35)
@@ -513,13 +512,13 @@ Kodu çalıştırdığınızda `35` değeri girerseniz normal olarak `try` sonra
513512
514513
Diğer bir deyişle, fonksiyondan çıkmanın iki yolu verdir. Bunlar `return` veya `throw` olabilir. `finally` ise bunların ikisini de idare edebilir.
515514
516-
517515
```smart header="Değişkenler `try...catch...finally` içerisinde yereldir"
518516
519-
Dikkat ederseniz `result` ve `diff` değişkenleri `try...catch`'den *önce* tanımlanmışlardır.
517+
Dikkat ederseniz `result` ve `diff` değişkenleri `try...catch`'den _önce_ tanımlanmışlardır.
520518

521519
Diğer türlü `let` `{...}` bloğunun içerisinde olsaydı, sadece parantez içerisinde görünür olurdu.
522-
```
520+
521+
`````
523522
524523
````smart header="`finally` ve `return`"
525524
@@ -545,8 +544,9 @@ function func() {
545544
}
546545

547546
alert( func() ); // önce finally içerisindeki alert çalışır sonra bu.
548-
```
549-
````
547+
`````
548+
549+
`````
550550

551551
````smart header="`try...finally`"
552552

@@ -563,7 +563,7 @@ function func() {
563563
}
564564
```
565565
Yukarıdaki kodda `try` içerisinde olacak herhangi bir hata doğrudan dışarı çıkacaktır. Akış dışarı sıçramadan önce `finally` çalışır.
566-
````
566+
`````
567567
568568
## Genel Hataları Yakalama
569569
@@ -580,7 +580,7 @@ Aslında şartnamede bunun ile ilgili bir belirti bulunmasa da çoğu ortam bunu
580580
Yazımı:
581581
582582
```js
583-
window.onerror = function(message, url, line, col, error) {
583+
window.onerror = function (message, url, line, col, error) {
584584
// ...
585585
};
586586
```
@@ -601,17 +601,17 @@ window.onerror = function(message, url, line, col, error) {
601601
602602
```html run untrusted refresh height=1
603603
<script>
604-
*!*
605-
window.onerror = function(message, url, line, col, error) {
606-
alert(`${message}\n At ${line}:${col} of ${url}`);
607-
};
608-
*/!*
609-
610-
function readData() {
611-
badFunc(); // hata meydana geldi!
612-
}
604+
*!*
605+
window.onerror = function(message, url, line, col, error) {
606+
alert(`${message}\n At ${line}:${col} of ${url}`);
607+
};
608+
*/!*
609+
610+
function readData() {
611+
badFunc(); // hata meydana geldi!
612+
}
613613

614-
readData();
614+
readData();
615615
</script>
616616
```
617617
@@ -624,7 +624,7 @@ Aşağıdaki gibi çalışırlar:
624624
1. Servise kayıt olunur ve yazdığımız koda yerleştirmek için bir kod parçası alınır.
625625
2. Bu JS içerisinde bir çeşit `window.onerror` uygulaması mevcuttur.
626626
3. Hata meydana geldiğinde, bu servise ağ üzerinden bir istekte bulunur.
627-
3. Servise tekrar giriş yaptığınızda arayüzde bu hataları görürsünüz.
627+
4. Servise tekrar giriş yaptığınızda arayüzde bu hataları görürsünüz.
628628
629629
## Özet
630630
@@ -635,22 +635,22 @@ Yazımı:
635635
```js
636636
try {
637637
// bu kodu çalıştır
638-
} catch(err) {
638+
} catch (err) {
639639
// eğer hata varsa, buraya atla
640640
// err hata objesi
641641
} finally {
642642
// try/catch'den sonra her halükarda burayı çalıştır.
643643
}
644644
```
645+
645646
`catch` bölümü veya `finally` bölümü olmadan da çalışır. `try...catch`, `try...finally`'de doğru kullanımdır.
646647
647648
Hata objeleri şu özellikleri taşır:
648649
649650
- `message` -- insan tarafından okunabilir hata mesajı
650-
- `name` -- hatanın ismi
651+
- `name` -- hatanın ismi
651652
- `stack` ( standart değil ) - hatanın oluştuğu andaki yığın. Hatanın nedenini bulmak için yararlı bir özellik.
652653
653-
654654
`throw` kullanarak biz de kendi hatalarımızı oluşturabiliriz. Teknik olarak, `throw`'un argümanları her şey olabilir. Fakat genelde `Error` sınıfından türemesi ve özelliklerini alması iyi bir yoldur. Bunları nasıl genişleteceğinizi bir sonraki bölümde görebilirsiniz.
655655
656656
Tekrar atma hata idaresi için temel bir desendir: bir `catch` bloğu her zaman hangi hataların geleceğini ve buna göre ne yapması gerektiğini bilmeli, eğer bilmiyorsa bu hatayı tekrar atmalıdır.

0 commit comments

Comments
 (0)