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
+43-43Lines changed: 43 additions & 43 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,16 +1,16 @@
1
-
# Hataları idare etme, "try..catch"
1
+
# Hataları idare etme, "try...catch"
2
2
3
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.
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
+
Hataları "yakalamak" için "try...catch" kullanarak doğrudan kodun ölmesine aman vermek yerine daha mantıklı şeyler yaptırabiliriz.
8
8
9
9
[cut]
10
10
11
-
## "try..catch" yazımı
11
+
## "try...catch" yazımı
12
12
13
-
`try..catch` yapısı iki ana bloktan oluşur: `try` (dene) ve sonrasında `catch` (yakala):
13
+
`try...catch` yapısı iki ana bloktan oluşur: `try` (dene) ve sonrasında `catch` (yakala):
14
14
15
15
```js
16
16
try {
@@ -28,13 +28,13 @@ try {
28
28
29
29
1. Önce `try {...}` içerisindekiler çalıştırılır.
30
30
2. Eğer hata yoksa `catch(err)` görmezden gelinir: çalışma try'ın sonuna ulaşır ve sonra `catch`'i atlar.
31
-
3. Eğer hata meydana gelirse, `try`'ın çalışması durdurulur ve `catch(err)` çalışmaya başlar. Buradaki `err` değişkeni ne olduda hata meydana geldiye dair detayları tutan bir objedir.
31
+
3. Eğer hata meydana gelirse, `try`'ın çalışması durdurulur ve `catch(err)` çalışmaya başlar. Buradaki `err` değişkeni "ne oldu da hata meydana geldi"ye dair detayları tutan bir objedir.
32
32
33
33

34
34
35
35
Öyleyse `try {...}` içerisindeki kod doğrudan sona eremez, bize `catch` içerisinde bunu idare etmemiz için olanak sağlar.
36
36
37
-
Bir kaç örnek ile daha da pekiştirelim:
37
+
Birkaç örnek ile daha da pekiştirelim:
38
38
39
39
40
40
- Hatasız örnek: `alert``(1)` ve `(2)`'yi gösterir:
@@ -80,8 +80,8 @@ Bir kaç örnek ile daha da pekiştirelim:
80
80
```
81
81
82
82
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.
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.
85
85
86
86
Eğer kod yazımsal olarak hatalıysa çalışmayacaktır, örneğin süslü parantezler açılmış ama kapatılmamışsa:
87
87
@@ -95,12 +95,12 @@ try {
95
95
96
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.
97
97
98
-
Bundan dolayı `try..catch` ancak ve ancak gerçerli kodlarda oluşacak hataları idare edebilir. Bu hatalara "çalışma zamanı hataları" veya bazen "istisnalar"(Exception) denilmektedir.
98
+
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
99
````
100
100
101
101
102
-
````warn header="`try..catch` Senkronize olarak çalışmaktadır"
103
-
Eğer "zamanlanmış" bir kodda, `setTimeout` gibi, bir hata meydana gelirse `try..catch` bunu yakalayamaz:
102
+
````warn header="`try...catch` Senkronize olarak çalışmaktadır"
103
+
Eğer "zamanlanmış" bir kodda, `setTimeout` gibi, bir hata meydana gelirse `try...catch` bunu yakalayamaz:
104
104
105
105
```js run
106
106
try {
@@ -111,14 +111,14 @@ try {
111
111
alert( "çalışmaz" );
112
112
}
113
113
```
114
-
Bunun nedeni `try..catch`'in aslında fonksiyonu zamanlayan `setTimeout`'u kapsamasıdan dolayıdır. Fakat fonksiyon daha sonra çlışır. O anda aslında motor `try..catch`i geçmiş olur.
114
+
Bunun nedeni `try...catch`'in aslında fonksiyonu zamanlayan `setTimeout`'u kapsamasıdan dolayıdır. Fakat fonksiyon daha sonra çalışır. O anda aslında motor `try...catch`i geçmiş olur.
115
115
116
-
Eğer zamanlanmış fonksiyon içerisinde bu hatayı yakalamak istiyorsanız, `try..catch` bloğunu fonksiyonun içerisine yazmalısınız:
116
+
Eğer zamanlanmış fonksiyon içerisinde bu hatayı yakalamak istiyorsanız, `try...catch` bloğunu fonksiyonun içerisine yazmalısınız:
Gerçek hayatta `try..catch`'ın nasıl kullanılabileceğine bakalım.
174
+
Gerçek hayatta `try...catch`'ın nasıl kullanılabileceğine bakalım.
175
175
176
176
Bildiğiniz gibi, JavaScript [JSON.parse(str)](mdn:js/JSON/parse) metodu sayesinde JSON olarak tanımlanmış değerlerin okunmasına olanak tanır.
177
177
@@ -194,11 +194,11 @@ JSON hakkında daha derin bilgiyi <info:json> bölümünden öğrenebilirsiniz.
194
194
195
195
**Eğer `json` düzgün gelmiyorsa `JSON.parse` hata üretir ve kod anında "ölür".**
196
196
197
-
Bunun ile yetinmeli miyiz? Elbette hayır
197
+
Bunun ile yetinmeli miyiz? Elbette hayır.
198
198
199
199
Bu şekliyle eğer gelen veride bir hata varsa ziyaretçi nerede yanlış olduğunu bilemeyecektir. İnsanlar hata olduğunda herhangi bir hata mesajı almadan öylece ölen bir şeyden nefret ederler.
200
200
201
-
Bunun çözümü için `try..catch` kullanılabilir:
201
+
Bunun çözümü için `try...catch` kullanılabilir:
202
202
203
203
```js run
204
204
let json = "{ bad json }";
@@ -254,9 +254,9 @@ Yazımı şu şekildedir:
254
254
```js
255
255
throw<error object>
256
256
```
257
-
Teknik olarak her şeyi hata objesi olarak kullanmak mümküdü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.)
257
+
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
258
259
-
JavaScript birçok standart hataya sahitir:`Error`, `SyntaxError`, `ReferenceError`, `TypeError` vs. Bunları kullanarak da hata objesiyaratmak mümkündür.
259
+
JavaScript birçok standart hataya sahiptir:`Error`, `SyntaxError`, `ReferenceError`, `TypeError` vs. Bunları kullanarak da hata objesi yaratmak mümkündür.
260
260
261
261
Yazımı:
262
262
@@ -268,7 +268,7 @@ let error = new ReferenceError(message);
268
268
// ...
269
269
```
270
270
271
-
Gömülü hatalar (objeler değil sadece hatalar) `name` özelliği yapıcının aynı isme sahip özelliğindne meydana gelir. `message` ise argümandan alınır.
271
+
Gömülü hatalar (objeler değil sadece hatalar) `name` özelliği yapıcının aynı isme sahip özelliğinde meydana gelir. `message` ise argümandan alınır.
272
272
273
273
Örneğin:
274
274
@@ -294,9 +294,9 @@ try {
294
294
Gördüğünüz gibi bu `SyntaxError` yani yazım yanlışıdır.
295
295
296
296
Bizim durumumuzda ise `name`'in olmaması yazım hatası olarak tanımlanabilir.
297
-
Bunu isimsiz öğretmen olmayacağından yazı hatası olarak tanımlayabiliri.
297
+
Bunu isimsiz öğretmen olmayacağından yazım hatası olarak tanımlayabilir.
298
298
299
-
atacak olursak:
299
+
Atacak olursak:
300
300
301
301
```js run
302
302
let json ='{ "yaş": 30 }'; // incomplete data
@@ -324,7 +324,7 @@ Artık `catch` tüm hata idaresinin yapılacağı yerdir: Buna `JSON.parse` ve d
324
324
325
325
## Tekrar atma (Rethrowing)
326
326
327
-
Yukarıdaki örnekte yanlış veri ile başa çıkmak için `try..catch` kullandık. Peki başka beklenmeyen hata varsa ne yapacağız? Mesela değişken tanımsız olabilir veya bilmediğimiz bir hata ile de karşılaşabiliriz.
327
+
Yukarıdaki örnekte yanlış veri ile başa çıkmak için `try...catch` kullandık. Peki başka beklenmeyen hata varsa ne yapacağız? Mesela değişken tanımsız olabilir veya bilmediğimiz bir hata ile de karşılaşabiliriz.
328
328
329
329
Şu şekilde:
330
330
@@ -340,9 +340,9 @@ try {
340
340
// (hata aslında JSON ile alakalı değil)
341
341
}
342
342
```
343
-
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)
343
+
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
344
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 beklenmeyecen bir hata almasına rağmen bundan dolayı `"JSON Error" mesajı verir. Bu aslında kod ayıklamayı zorlaştıran bir şeydir ve yanlış kullanımdır.
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.
346
346
347
347
Yine de ne hatası olduğunu `name`'den çıkarmak mümkündür.
348
348
@@ -358,11 +358,11 @@ try {
358
358
359
359
Kural basit:
360
360
361
-
**Catch sadece bildiği hataları işlemeli diğerlerini ise tekrar hata olarak atmalı**
361
+
**Catch sadece bildiği hataları işlemeli diğerlerini ise tekrar hata olarak atmalı.**
362
362
363
363
"tekrar atma" tekniği şu şekilde detaylandırılabilir:
364
364
365
-
1. Catch tüm mesajları alır
365
+
1. Catch tüm mesajları alır.
366
366
2.`catch(err){...}` bloğunda tüm error objesi analiz edilir.
367
367
3. Eğer beklemediğimiz bir hata ise bu `throw err` ile tekrar atılır.
368
368
@@ -396,11 +396,11 @@ try {
396
396
397
397
}
398
398
```
399
-
`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.
399
+
`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
400
401
401
Böylece `catch` bloğu aslında sadece bildiği hataları idare eder ve diğerlerini hiç kontrol etmeden paslar diyebiliriz.
402
402
403
-
Aşağıdaki örnekte bu hatalar nasıl bir `try..catch` seviyesi daha eklenerek idare edilebilir bunu göreceğiz:
403
+
Aşağıdaki örnekte bu hatalar nasıl bir `try...catch` seviyesi daha eklenerek idare edilebilir bunu göreceğiz:
404
404
405
405
```js run
406
406
functionreadData() {
@@ -429,13 +429,13 @@ try {
429
429
*/!*
430
430
}
431
431
```
432
-
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.
432
+
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
433
434
-
## try..catch..finally
434
+
## try...catch...finally
435
435
436
436
Aslında tamamı bu kadar değil!
437
437
438
-
`try..catch` bloğu son olarak `finally` ile bitebilir.
438
+
`try...catch` bloğu son olarak `finally` ile bitebilir.
439
439
440
440
Eğer varsa aşağıdaki durumların hepsi için çalışır:
441
441
@@ -472,9 +472,9 @@ Kod iki türlü çalışabilir:
472
472
1. Eğer "Make an error?"'a "Yes" cevabını verirseniz, `try -> catch -> finally` şeklinde sona erer.
473
473
2. Eğer "No" derseniz `try-> finally` şeklinde sona erer.
474
474
475
-
`finally` genelde `try..catch`'den önce bir şey yapıp bunu sona erdirmek (finally) istediğiniz durumlarda kullanılır.
475
+
`finally` genelde `try...catch`'den önce bir şey yapıp bunu sona erdirmek (finally) istediğiniz durumlarda kullanılır.
476
476
477
-
Örneğin Fibonacci sayılarını hesaplayan bir fonksiyonun ne kadar sürdüğünü ölçmek istediğinizde, doğal olarak işlem başlamadan süre başlar ve işlem bittikten sonra süre biter. Fakat diyelimki fonksiyonda bir hata var. Aşağıda uygulaması görünen `fib(n)`'e negatif bir sayı gönderdiğinizde veya integer olmayan bir sayı gönderdiğinizde hata döner.
477
+
Örneğin Fibonacci sayılarını hesaplayan bir fonksiyonun ne kadar sürdüğünü ölçmek istediğinizde, doğal olarak işlem başlamadan süre başlar ve işlem bittikten sonra süre biter. Fakat diyelim ki fonksiyonda bir hata var. Aşağıda uygulaması görünen `fib(n)`'e negatif bir sayı gönderdiğinizde veya integer olmayan bir sayı gönderdiğinizde hata döner.
478
478
479
479
`finally` ne olursa olsun süre ölçmeyi sonlandırmak için harika bir yerdir.
480
480
@@ -514,16 +514,16 @@ Kodu çalıştırdığınızda `35` değeri girerseniz normal olarak `try` sonra
514
514
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
515
516
516
517
-
```smart header="Değişkenler `try..catch..finally` içerisinde yereldir"
517
+
```smart header="Değişkenler `try...catch...finally` içerisinde yereldir"
518
518
519
-
Dikkat ederseniz `result` ve `diff` değişkenleri `try..catch`'den *önce* tanımlanmışlardır.
519
+
Dikkat ederseniz `result` ve `diff` değişkenleri `try...catch`'den *önce* tanımlanmışlardır.
520
520
521
521
Diğer türlü `let``{...}` bloğunun içerisinde olsaydı, sadece parantez içerisinde görünür olurdu.
522
522
```
523
523
524
524
````smart header="`finally` ve `return`"
525
525
526
-
Finally kelimesi `try..catch`'den her türlü çıkış ile çalışır. Bu doğrudan `return` için de geçerlidir.
526
+
Finally kelimesi `try...catch`'den her türlü çıkış ile çalışır. Bu doğrudan `return` için de geçerlidir.
527
527
528
528
Aşağıdaki örnekte `try` içerisinde `return` bulunmaktadır. Bu durumda `finally` sonuç dış koda iletilmeden önce çalışır.
529
529
@@ -550,7 +550,7 @@ alert( func() ); // önce finally içerisindeki alert çalışır sonra bu.
550
550
551
551
````smart header="`try..finally`"
552
552
553
-
`catch` olmadan hazırlanan `try..finally` yapısı da kullışlıdır. Bunu henelde hatayı o anda idare etmek istemediğimizde kullanırız, bunun ile birlikte başladığımız işlemin bittiğini de garanti altına almak isteriz.
553
+
`catch` olmadan hazırlanan `try..finally` yapısı da kullanışlıdır. Bunu genelde hatayı o anda idare etmek istemediğimizde kullanırız, bununla birlikte başladığımız işlemin bittiğini de garanti altına almak isteriz.
554
554
555
555
```js
556
556
function func() {
@@ -571,7 +571,7 @@ Yukarıdaki kodda `try` içerisinde olacak herhangi bir hata doğrudan dışarı
571
571
Aşağıdaki bölüm aslında JavaScript çekirdeğinde bulunmamaktadır.
572
572
```
573
573
574
-
Diyelim ki `try..catch`'in dışında bir hata ile karşılaştınız ve kodunuz sona erdi. Bu programlama hatası veya başka bir hata olabilir.
574
+
Diyelim ki `try...catch`'in dışında bir hata ile karşılaştınız ve kodunuz sona erdi. Bu programlama hatası veya başka bir hata olabilir.
575
575
576
576
Böyle bir durumda ne yapmak lazım? Hataları loglayabilir, kullanıcıya bir hata gösterebiliriz.
577
577
@@ -628,7 +628,7 @@ Aşağıdaki gibi çalışırlar:
628
628
629
629
## Özet
630
630
631
-
`try..catch` yapısı çalışma zamanlı hataları idare eder. Tam olarak kodu çalıştırmaya çalışır ve hataları yakalar.
631
+
`try...catch` yapısı çalışma zamanlı hataları idare eder. Tam olarak kodu çalıştırmaya çalışır ve hataları yakalar.
632
632
633
633
Yazımı:
634
634
@@ -642,7 +642,7 @@ try {
642
642
// try/catch'den sonra her halükarda burayı çalıştır.
643
643
}
644
644
```
645
-
`catch` bölümü veya `finally` bölümü olmadan da çalışır. `try..catch`, `try..finally`'de doğru kullanımdır.
645
+
`catch` bölümü veya `finally` bölümü olmadan da çalışır. `try...catch`, `try..finally`'de doğru kullanımdır.
646
646
647
647
Hata objeleri şu özellikleri taşır:
648
648
@@ -655,4 +655,4 @@ Hata objeleri şu özellikleri taşır:
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.
657
657
658
-
`try..catch` olmasa bile çoğu ortam "genel" bir hata idarecisi oluşturmamızı sağlar. Böylece gözden kaçan hatalar burada yakalanabilir. Tarayıcı için bu `window.onerror`'dur.
658
+
`try...catch` olmasa bile çoğu ortam "genel" bir hata idarecisi oluşturmamızı sağlar. Böylece gözden kaçan hatalar burada yakalanabilir. Tarayıcı için bu `window.onerror`'dur.
0 commit comments