You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/10-error-handling/1-try-catch/article.md
+77-77Lines changed: 77 additions & 77 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,10 +1,10 @@
1
-
# Hataları idare etme, "try...catch"
1
+
# Hata Yönetimi, "try...catch"
2
2
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.
4
4
5
5
Genelde kodda bir hata olduğunda yazdığımız kod bir adım ileriye gidemeden sona erer ve konsola bunun nedenini yazar.
6
6
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.
8
8
9
9
[cut]
10
10
@@ -14,17 +14,13 @@ Hataları "yakalamak" için "try...catch" kullanarak doğrudan kodun ölmesine a
14
14
15
15
```js
16
16
try {
17
-
18
17
// kod...
19
-
20
18
} catch (err) {
21
-
22
-
// hataları idare et.
23
-
19
+
// hata yönetimi.
24
20
}
25
21
```
26
22
27
-
Çalışması aşağıdaki gibidir:
23
+
Şu şekilde çalışır:
28
24
29
25
1. Önce `try {...}` içerisindekiler çalıştırılır.
30
26
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 {
34
30
35
31
Öyleyse `try {...}` içerisindeki kod doğrudan sona eremez, bize `catch` içerisinde bunu idare etmemiz için olanak sağlar.
36
32
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.
41
34
42
-
```js run
43
-
try {
35
+
- Hatasız örnek: `alert``(1)` ve `(2)`'yi gösterir:
44
36
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) <--*/!*
52
40
53
-
alert('Catch görmezden gelindi çünkü bir hata meydana gelmedi.'); // (3)
41
+
// ...no errors here
54
42
55
-
}
43
+
alert("try bitti"); // *!*(2) <--*/!*
44
+
} catch (err) {
45
+
alert("Catch görmezden gelindi çünkü bir hata meydana gelmedi."); // (3)
46
+
}
56
47
57
-
alert("...Kod normal çalışmasına devam etti.");
58
-
```
48
+
alert("...Kod normal çalışmasına devam etti.");
49
+
```
59
50
60
51
- Hatalı örnek: `(1)` ve `(3)`'ü gösterir:
61
52
62
-
```js run
63
-
try {
64
-
65
-
alert('try başladı'); // *!*(1) <--*/!*
53
+
```js run
54
+
try {
66
55
67
-
*!*
68
-
lalala; // hata, değişken tanımlı değil!
69
-
*/!*
56
+
alert('try başladı'); // *!*(1) <--*/!*
70
57
71
-
alert('trybitti (hiç erişilemedi)'); // (2)
58
+
*!*
59
+
lalala; // hata, değişken tanımlı değil!
60
+
*/!*
72
61
73
-
} catch(err) {
62
+
alert('try bitti (Hiç erişilemedi)'); // (2)
74
63
75
-
alert(`Hata meydana geldi!`); // *!*(3) <--*/!*
64
+
} catch(err) {
76
65
77
-
}
66
+
alert(`Hata meydana geldi!`); // *!*(3) <--*/!*
78
67
79
-
alert("...Kod normal çalışmasına devam etti.");
80
-
```
68
+
}
81
69
70
+
alert("...Kod normal çalışmasına devam etti.");
71
+
```
82
72
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.
85
74
86
75
Eğer kod yazımsal olarak hatalıysa çalışmayacaktır, örneğin süslü parantezler açılmış ama kapatılmamışsa:
87
76
@@ -93,10 +82,11 @@ try {
93
82
}
94
83
```
95
84
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.
97
86
98
87
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
+
`````
100
90
101
91
102
92
````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
@@ -133,10 +123,12 @@ Hata meydana geldiğinde, JavaScript bu hata ile ilgili bir obje yaratır. Sonra
133
123
```js
134
124
try {
135
125
// ...
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
137
128
// ...
138
129
}
139
130
```
131
+
140
132
Tüm varsayılan hatalar için, `catch` içerisinde hata objesi iki ana özelliği taşır:
141
133
142
134
`isim` (name)
@@ -168,7 +160,6 @@ try {
168
160
}
169
161
```
170
162
171
-
172
163
## `try...catch` kullanımı
173
164
174
165
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.
190
181
alert( user.name ); // John
191
182
alert( user.age ); // 30
192
183
```
184
+
193
185
JSON hakkında daha derin bilgiyi <info:json> bölümünden öğrenebilirsiniz.
194
186
195
187
**Eğer `json` düzgün gelmiyorsa `JSON.parse` hata üretir ve kod anında "ölür".**
@@ -213,12 +205,13 @@ try {
213
205
} catch (e) {
214
206
*!*
215
207
// ...ç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" );
217
209
alert( e.name );
218
210
alert( e.message );
219
211
*/!*
220
212
}
221
213
```
214
+
222
215
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.
223
216
224
217
## Kendi hatalarımızı atma
@@ -241,6 +234,7 @@ try {
241
234
alert( "çalışmaz" );
242
235
}
243
236
```
237
+
244
238
Burada `JSON.parse` doğru bir şekilde çalışır, `"name"`'in olmaması aslında bir sorundur.
245
239
246
240
Hata idaresini birleştirmek adına burada `throw` operatörü kullanılacaktır.
@@ -254,6 +248,7 @@ Yazımı şu şekildedir:
254
248
```js
255
249
throw<error object>
256
250
```
251
+
257
252
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.)
258
253
259
254
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");
278
273
alert(error.name); // Error
279
274
alert(error.message); // Bir şeyler oldu o_O
280
275
```
276
+
281
277
`JSON.parse` ne tarz hatalar üretti bakalım:
282
278
283
279
```js run
@@ -293,7 +289,7 @@ try {
293
289
294
290
Gördüğünüz gibi bu `SyntaxError` yani yazım yanlışıdır.
295
291
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.
297
293
Bunu isimsiz öğretmen olmayacağından yazım hatası olarak tanımlayabilir.
298
294
299
295
Atacak olursak:
@@ -335,14 +331,15 @@ try {
335
331
user =JSON.parse(json); // <-- user'dan önce "let" kullanmayı unuttuysak
336
332
337
333
// ...
338
-
} catch(err) {
334
+
} catch(err) {
339
335
alert("JSON Error: "+ err); // JSON Error: ReferenceError: user is not defined
340
336
// (hata aslında JSON ile alakalı değil)
341
337
}
342
338
```
339
+
343
340
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).
344
341
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.
346
343
347
344
Yine de ne hatası olduğunu `name`'den çıkarmak mümkündür.
348
345
@@ -396,6 +393,7 @@ try {
396
393
397
394
}
398
395
```
396
+
399
397
`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.
400
398
401
399
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 {
429
427
*/!*
430
428
}
431
429
```
430
+
432
431
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.
433
432
434
433
## try...catch...finally
@@ -458,12 +457,12 @@ Aşağıdaki kodu çalıştırmayı deneyiniz:
458
457
459
458
```js run
460
459
try {
461
-
alert('try');
462
-
if (confirm('Make an error?')) BAD_CODE();
460
+
alert("try");
461
+
if (confirm("Make an error?")) BAD_CODE();
463
462
} catch (e) {
464
-
alert('catch');
463
+
alert("catch");
465
464
} finally {
466
-
alert('finally');
465
+
alert("finally");
467
466
}
468
467
```
469
468
@@ -478,7 +477,7 @@ Kod iki türlü çalışabilir:
478
477
479
478
`finally` ne olursa olsun süre ölçmeyi sonlandırmak için harika bir yerdir.
480
479
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.
482
481
483
482
```js run
484
483
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
513
512
514
513
Diğer bir deyişle, fonksiyondan çıkmanın iki yolu verdir. Bunlar `return` veya `throw` olabilir. `finally` ise bunların ikisini de idare edebilir.
515
514
516
-
517
515
```smart header="Değişkenler `try...catch...finally` içerisinde yereldir"
518
516
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.
520
518
521
519
Diğer türlü `let``{...}` bloğunun içerisinde olsaydı, sadece parantez içerisinde görünür olurdu.
522
-
```
520
+
521
+
`````
523
522
524
523
````smart header="`finally` ve `return`"
525
524
@@ -545,8 +544,9 @@ function func() {
545
544
}
546
545
547
546
alert( func() ); // önce finally içerisindeki alert çalışır sonra bu.
548
-
```
549
-
````
547
+
`````
548
+
549
+
`````
550
550
551
551
````smart header="`try...finally`"
552
552
@@ -563,7 +563,7 @@ function func() {
563
563
}
564
564
```
565
565
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
+
`````
567
567
568
568
## Genel Hataları Yakalama
569
569
@@ -580,7 +580,7 @@ Aslında şartnamede bunun ile ilgili bir belirti bulunmasa da çoğu ortam bunu
alert(`${message}\n At ${line}:${col} of ${url}`);
607
+
};
608
+
*/!*
609
+
610
+
functionreadData() {
611
+
badFunc(); // hata meydana geldi!
612
+
}
613
613
614
-
readData();
614
+
readData();
615
615
</script>
616
616
```
617
617
@@ -624,7 +624,7 @@ Aşağıdaki gibi çalışırlar:
624
624
1. Servise kayıt olunur ve yazdığımız koda yerleştirmek için bir kod parçası alınır.
625
625
2. Bu JS içerisinde bir çeşit `window.onerror` uygulaması mevcuttur.
626
626
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.
628
628
629
629
## Özet
630
630
@@ -635,22 +635,22 @@ Yazımı:
635
635
```js
636
636
try {
637
637
// bu kodu çalıştır
638
-
} catch(err) {
638
+
} catch(err) {
639
639
// eğer hata varsa, buraya atla
640
640
// err hata objesi
641
641
} finally {
642
642
// try/catch'den sonra her halükarda burayı çalıştır.
643
643
}
644
644
```
645
+
645
646
`catch` bölümü veya `finally` bölümü olmadan da çalışır. `try...catch`, `try...finally`'de doğru kullanımdır.
646
647
647
648
Hata objeleri şu özellikleri taşır:
648
649
649
650
- `message` -- insan tarafından okunabilir hata mesajı
650
-
-`name` -- hatanın ismi
651
+
- `name` -- hatanın ismi
651
652
- `stack` ( standart değil ) - hatanın oluştuğu andaki yığın. Hatanın nedenini bulmak için yararlı bir özellik.
652
653
653
-
654
654
`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.
655
655
656
656
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