{"id":2400,"date":"2015-06-22T23:34:59","date_gmt":"2015-06-22T20:34:59","guid":{"rendered":"http:\/\/koddit.com\/?p=2400"},"modified":"2015-07-01T13:38:20","modified_gmt":"2015-07-01T10:38:20","slug":"swift-2-ile-hata-yonetimi-error-handling","status":"publish","type":"post","link":"https:\/\/blog.koddit.com\/en\/ios\/swift-2-ile-hata-yonetimi-error-handling\/","title":{"rendered":"Swift 2 ile Hata Y\u00f6netimi (Error Handling)"},"content":{"rendered":"<p>WWDC 2015&#8217;de duyurulan Swift 2&#8217;nin getirdi\u011fi\u00a0en\u00a0kapsaml\u0131 \u00f6zellik yeni bir &#8220;error handling&#8221;\u00a0mekanizmas\u0131. Programda beklenmeyen durumlar\u0131\u00a0yakalay\u0131p gerekli \u015feyleri yapt\u0131\u011f\u0131m\u0131z\u00a0&#8220;error handling&#8221;&#8216;i kaba bir \u015fekilde T\u00fcrk\u00e7e&#8217;ye &#8220;hata y\u00f6netimi&#8221; veya &#8220;hata yakalama&#8221; olarak \u00e7evirebiliriz. Swift 2 \u00f6ncesi yazd\u0131\u011f\u0131n\u0131z program\u0131n u\u00e7 durumlarda\u00a0do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak istiyorsan\u0131z\u00a0izleyebilece\u011finiz iki yol vard\u0131;\u00a0bunlar\u0131n ilki Apple&#8217;\u0131n \u00f6nerdi\u011fi\u00a0<em>NSError<\/em> s\u0131n\u0131f\u0131n\u0131 kullanmak. Bu y\u00f6ntem ile\u00a0\u015f\u00f6yle bir kod yazman\u0131z gerekliydi;<\/p>\n<pre class=\"lang:swift decode:true\" title=\"NSError \u0130le Hata D\u00fczeltme\">var hata: NSError?\r\nlet dosya = NSFileManager.defaultManager().contentsOfDirectoryAtPath(\"\/Users\/Koddit\", error: &amp;hata)\r\nif let hata = hata {\r\n    \/\/ Hata olu\u015ftu\r\n} else {\r\n    \/\/ S\u0131k\u0131nt\u0131 yok, i\u00e7eri\u011fi kullan.\r\n}<\/pre>\n<p>Bu yakla\u015f\u0131mdaki en b\u00fcy\u00fck sorun <em>NSError<\/em> nesnesinin kontrol edilip edilmedi\u011fini derleyicinin takip edemiyor olmas\u0131. Programc\u0131 basit bir kontrol\u00fc atlad\u0131\u011f\u0131nda daha \u00f6nce testlerde ya\u015fanmayan ve pek beklenmeyen bir durumda uygulaman\u0131n patlamas\u0131 \u00e7ok olas\u0131. \u00a0Apple Swift 2 ile bunun \u00f6n\u00fcne ge\u00e7mek i\u00e7in\u00a0<em>NSError<\/em>&#8216;\u00fcn bu kullan\u0131m\u0131 kald\u0131rarak daha bilindik try-catch yap\u0131s\u0131n\u0131 dile ekliyor. Ayn\u0131 kodu Swift 2 ile yazarsak;<\/p>\n<pre class=\"lang:swift decode:true\" title=\"Swift 2 ile Hata Kontrol\u00fc\">do {\r\n    let dosya = try NSFileManager.defaultManager().contentsOfDirectoryAtPath(\"\/Users\/Koddit\")\r\n    \/\/ S\u0131k\u0131nt\u0131 yok, dosyay\u0131 kullan.\r\n} catch {\r\n    \/\/ Hata olu\u015ftu\r\n}<\/pre>\n<p>B\u00f6ylece hem kod k\u0131sa k\u0131sald\u0131 hem de programc\u0131 olarak hata yapma olas\u0131l\u0131\u011f\u0131n\u0131z neredeyse ortadan kalkt\u0131. Ancak ve lakin ba\u015fta da belirtti\u011fim gibi\u00a0<em>NSError<\/em> tek y\u00f6ntem\u00a0de\u011fil. \u00c7o\u011fu ki\u015fi kendi kodunda\u00a0<em>NSError<\/em> ile u\u011fra\u015fmak yerine d\u00f6nen de\u011feri kontrol etmeyi veya daha kar\u0131\u015f\u0131k ve projeye \u00f6zel\u00a0yap\u0131lar\u00a0kullanmay\u0131 tercih <a href=\"http:\/\/owensd.io\/2014\/07\/09\/error-handling.html\">ediyor<\/a> ki bu herkes i\u00e7in tam bir kaos. \u00d6zellikle ba\u015fkas\u0131n\u0131n kodunu kulland\u0131\u011f\u0131n\u0131z durumlarda yanl\u0131\u015f \u015feyler yapman\u0131z veya bir \u015feyleri atlaman\u0131z \u00e7ok olas\u0131. Pek kullan\u0131\u015fl\u0131 olmayan ancak basit bir \u00f6rne\u011fe g\u00f6z atarsak;<\/p>\n<pre class=\"lang:xhtml decode:true\" title=\"Hata D\u00fczeltme Kullanmadan B\u00f6lme Fonksiyonu\">func b\u00f6l (b\u00f6l\u00fcnen: Int, b\u00f6len: Int) -&gt; Int?\r\n{\r\n    if (b\u00f6len == 0 ) {\r\n        return nil;\r\n    }\r\n    return b\u00f6l\u00fcnen \/ b\u00f6len;\r\n}\r\n\r\nif let sonu\u00e7 = b\u00f6l (3, b\u00f6len: 1 ){\r\n    \/\/ Sonucu kullan\r\n}<\/pre>\n<p>Fonksiyon e\u011fer b\u00f6len 0 ise <em>nil<\/em>, de\u011filse b\u00f6lme i\u015fleminin sonucunu d\u00f6nd\u00fcr\u00fcyor. Ancak geriye <em>nil<\/em> d\u00f6nmesi kodu ilk kez kullanan ki\u015fi\u00a0a\u00e7\u0131s\u0131ndan pek yararl\u0131 de\u011fil, e\u011fer dok\u00fcmantasyon da yoksa niye <em>nil<\/em> d\u00f6nd\u00fc\u011f\u00fcn\u00fc\u00a0anlamas\u0131 i\u00e7in kodu okumas\u0131 \u015fart. Elbette geriye hata mesaj\u0131 d\u00f6nd\u00fcrmek vs. gibi olaylara girilebilir ancak bunlar da kodun iyice da\u011f\u0131lmas\u0131na ve kar\u0131\u015f\u0131k\u00a0hale gelmesine sebep olabilir. Swift 2 neyse ki bizi bu tarz dertlerden kurtar\u0131yor;<\/p>\n<pre class=\"lang:xhtml decode:true\" title=\"Hata D\u00fczeltme ile B\u00f6lme Fonksiyonu\">enum B\u00f6lmeHatas\u0131: ErrorType\r\n{\r\n    case B\u00f6lenS\u0131f\u0131r;\r\n}\r\n\r\nfunc b\u00f6l (b\u00f6l\u00fcnen: Int, b\u00f6len: Int) throws -&gt; Int\r\n{\r\n    if (b\u00f6len == 0) {\r\n        throw B\u00f6lmeHatas\u0131.B\u00f6lenS\u0131f\u0131r;\r\n    }\r\n    return b\u00f6l\u00fcnen \/ b\u00f6len;\r\n}\r\n\r\ndo {\r\n    let sonu\u00e7 = try b\u00f6l (3, b\u00f6len: 1);\r\n    \/\/ Sonucu kullan\r\n} catch B\u00f6lmeHatas\u0131.B\u00f6lenS\u0131f\u0131r {\r\n    \/\/ B\u00f6len s\u0131f\u0131r oldu\u011fu i\u00e7in hata olu\u015ftu.\r\n}<\/pre>\n<p><em>ErrorType<\/em> Swift 2 ile gelen yeni bir protokol, <em>catch <\/em>ile\u00a0yakalad\u0131\u011f\u0131m\u0131z hatalar\u0131n bu protokol\u00fc desteklemesi gerekiyor. B\u00f6lme s\u0131ras\u0131ndaki olabilecek hatalar\u0131 tan\u0131mlad\u0131ktan sonra fonksiyonu &#8220;<em>throws<\/em>&#8221; olarak tan\u0131ml\u0131yoruz ve hatalar\u0131n olu\u015ftu\u011fu noktalarda &#8220;<em>throw<\/em>&#8221; kelimesi ile ilgili hatalar\u0131 f\u0131rlat\u0131yoruz. \u00d6nceki \u00f6rne\u011fe g\u00f6re biraz daha fazla kod i\u00e7erse de bu \u015fekilde yazmak hem daha temiz hem daha de\u011fi\u015fikliklere a\u00e7\u0131k.<\/p>\n<p>O zaman temel yap\u0131dan bahsetti\u011fimize g\u00f6re yeni y\u00f6ntemin yararlar\u0131n\u0131 anlayabilmek i\u00e7in \u00f6nce daha kar\u0131\u015f\u0131k bir \u00f6rnekten yola \u00e7\u0131karak koda \u00f6nce klasik hata d\u00fczeltme y\u00f6ntemlerini eklemeyi\u00a0deneyelim\u00a0ve daha sonra Swift 2&#8217;ye d\u00f6n\u00fc\u015ft\u00fcrelim;<\/p>\n<pre class=\"lang:xhtml decode:true\" title=\"Hayali bir fatura \u00f6deme sistemi\">func suParas\u0131n\u0131Yat\u0131r (miktar miktar: Int) -&gt; Int?\r\n{\r\n    if (!sorguBa\u015flat()) {\r\n        return nil;\r\n    }\r\n    if let kullan\u0131c\u0131Borcu = bor\u00e7Sorgula() where kullan\u0131c\u0131Borcu &lt;= miktar\r\n    {\r\n        if (!i\u015flemiOnayla ()) {\r\n            return nil;\r\n        }\r\n        sorguBitir(); \/\/ False d\u00f6nse de i\u015flem bitti.\r\n        return miktar - kullan\u0131c\u0131Borcu; \/\/ Para \u00fcst\u00fc\r\n    }\r\n    sorguBitir(); \/\/ False d\u00f6nse de i\u015flem zaten iptal.\r\n    return nil;\r\n}\r\n\r\nfunc sorguBa\u015flat () -&gt; Bool {\r\n    \/\/ Bu fonksiyonun database e ba\u011flant\u0131 kurmak \/ session ba\u015flatmak  \r\n    \/\/gibi i\u015flemler yapt\u0131\u011f\u0131n\u0131 hayal edin.\r\n    \/\/ Bunlar\u0131 yapamad\u0131\u011f\u0131nda geriye false d\u00f6n\u00fcyor.\r\n    return false;\r\n}\r\nfunc sorguBitir () -&gt; Bool {\r\n    \/\/ Bu fonksiyonun database le olan ba\u011flant\u0131y\u0131 kapatmak \/ session'\u0131 \r\n    \/\/sona erdirmek  gibi i\u015flemler yapt\u0131\u011f\u0131n\u0131 hayal edin.\r\n    \/\/ Bunlar\u0131 yapamad\u0131\u011f\u0131nda geriye false d\u00f6n\u00fcyor.\r\n    return false;\r\n}\r\n\r\nfunc bor\u00e7Sorgula () -&gt; Int?\r\n{\r\n    \/\/ E\u011fer fatura \u00f6denmediyse miktar\u0131 d\u00f6nd\u00fcr.\r\n    if (sonFatura\u00d6denmi\u015fMi()) {\r\n        return nil;\r\n    }\r\n    return 150; \/\/ Bunun sistemden d\u00f6nd\u00fc\u011f\u00fcn\u00fc hayal edin.\r\n}\r\n\r\nfunc sonFatura\u00d6denmi\u015fMi () -&gt; Bool\r\n{\r\n    \/\/ Sisteme son borcu sor\r\n    return false; \/\/ Bunun sistemden d\u00f6nd\u00fc\u011f\u00fcn\u00fc hayal edin.\r\n}\r\n\r\nfunc i\u015flemiOnayla () -&gt; Bool {\r\n    \/\/ Sisteme paray\u0131 aktard\u0131\u011f\u0131n\u0131 ve borcu sildi\u011fini hayal edin.\r\n    \/\/ Bunlar\u0131 yapamad\u0131\u011f\u0131nda geriye false d\u00f6n\u00fcyor.\r\n    return true;\r\n}\r\n\r\nif let sonu\u00e7 = suParas\u0131n\u0131Yat\u0131r(miktar: 50) {\r\n    \/\/ Para ba\u015far\u0131yla yat\u0131r\u0131ld\u0131.\r\n} else {\r\n    \/\/ Para yat\u0131r\u0131lamad\u0131.\r\n}<\/pre>\n<p>Bu hayali tahsilat program\u0131nda kullan\u0131c\u0131 su paras\u0131n\u0131 \u00f6demek istedi\u011finde \u00f6ncelikle <em>suParas\u0131n\u0131Yat\u0131r<\/em> fonksiyonu \u00e7al\u0131\u015f\u0131yor ve gerekli ba\u011flant\u0131lar\u0131 olu\u015fturuyor, ard\u0131ndan sisteme kullan\u0131c\u0131n\u0131n bor\u00e7 miktar\u0131n\u0131 soruyor ve i\u015flemi onayl\u0131yor, hepsi sona erince de ba\u011flant\u0131lar\u0131 bitirip para \u00fcst\u00fcn\u00fc geriye d\u00f6nd\u00fcr\u00fcyor. Herhangi bir s\u0131k\u0131nt\u0131 olu\u015ftu\u011fu anda ise\u00a0t\u00fcm fonksiyonlar <em>nil<\/em> d\u00f6nd\u00fcr\u00fcyor ki bu b\u00fcy\u00fck bir problem, kullan\u0131c\u0131ya bu durumda neyin yanl\u0131\u015f gitti\u011fini aktarman\u0131z veya programc\u0131 olarak kullan\u0131c\u0131ya \u00e7akt\u0131rmadan bunlar\u0131 halletmeniz m\u00fcmk\u00fcn de\u011fil.<\/p>\n<p>E\u011fer koda Swift 2 \u00f6ncesindeki gibi bir hata y\u00f6netimi\u00a0yaparsak yakla\u015f\u0131k \u015f\u00f6yle bir kod elde ederiz;<\/p>\n<pre class=\"lang:xhtml decode:true\" title=\"Hata d\u00fczeltme ile Fatura \u00d6deme Sistemi\">var bir\u015feylerTersGitti = false; \/\/ Sahte hata olu\u015fturmak i\u00e7in, yok sayabilirsiniz.\r\n\r\nfunc suParas\u0131n\u0131Yat\u0131r (miktar miktar: Int) -&gt; (para\u00dcst\u00fc: Int, hataMesaj\u0131: String?)\r\n{\r\n    var hata: NSError?;\r\n    var para\u00dcst\u00fc: Int = 0, hataMesaj\u0131: String?;\r\n    sorguBa\u015flat(&amp;hata);\r\n    if (hata != nil) {\r\n        hataMesaj\u0131 = hata!.localizedDescription;\r\n    } else {\r\n        let bor\u00e7Miktar\u0131 = bor\u00e7Sorgula(&amp;hata);\r\n        if (hata != nil) {\r\n            hataMesaj\u0131 = hata!.localizedDescription;\r\n        } else if bor\u00e7Miktar\u0131 &lt;= miktar {\r\n            i\u015flemiOnayla (&amp;hata);\r\n            if (hata != nil) {\r\n                hataMesaj\u0131 = hata!.localizedDescription;\r\n            } else {\r\n                para\u00dcst\u00fc = miktar - bor\u00e7Miktar\u0131;\r\n            }\r\n        } else {\r\n            let eksik = bor\u00e7Miktar\u0131 - miktar; \/\/ T\u00fcrk\u00e7e karakter sorunu y\u00fcz\u00fcnden sonraki sat\u0131rda \" \" i\u00e7erisinde de\u011fil, orada kullanabilirsiniz.\r\n            hataMesaj\u0131 = \"\\(eksik)\" + \" TL eksik.\";\r\n        }\r\n        sorguBitir(&amp;hata);\r\n        if (hata != nil) {\r\n            \/\/ Yeniden dene?\r\n            \/\/ PS: \u0130\u015flem zaten sona erdi o y\u00fczden hatay\u0131 g\u00f6ndermeye gerek yok.\r\n        }\r\n    }\r\n    return (para\u00dcst\u00fc, hataMesaj\u0131);\r\n}\r\n\r\nfunc sorguBa\u015flat (error: NSErrorPointer) {\r\n    \/\/ Bu fonksiyonun database e ba\u011flant\u0131 kurmak \/ session ba\u015flatmak\r\n    \/\/ gibi i\u015flemler yapt\u0131\u011f\u0131n\u0131 hayal edin.\r\n    if (bir\u015feylerTersGitti) {\r\n        hataOlu\u015ftur(error, hataMesaj\u0131: \"Sorgu ba\u015flat\u0131l\u0131rken zaman a\u015f\u0131m\u0131 oldu.\", kod: 101)\r\n    }\r\n}\r\n\r\nfunc sorguBitir (error: NSErrorPointer) {\r\n    \/\/ Bu fonksiyonun database le olan ba\u011flant\u0131y\u0131 kapatmak \/ session'\u0131 \r\n    \/\/sona erdirmek  gibi i\u015flemler yapt\u0131\u011f\u0131n\u0131 hayal edin.\r\n    if (bir\u015feylerTersGitti) {\r\n        hataOlu\u015ftur(error, hataMesaj\u0131: \"Sorgu sonland\u0131r\u0131l\u0131rken zaman a\u015f\u0131m\u0131 oldu.\", kod: 101)\r\n    }\r\n}\r\n\r\nfunc bor\u00e7Sorgula (error: NSErrorPointer) -&gt; Int\r\n{\r\n    \/\/ E\u011fer fatura \u00f6denmediyse miktar\u0131 d\u00f6nd\u00fcr.\r\n    if (sonFatura\u00d6denmi\u015fMi()) {\r\n        hataOlu\u015ftur(error, hataMesaj\u0131: \"\u00d6denmemi\u015f bor\u00e7 bulunamad\u0131.\", kod: 102)\r\n        return 0;\r\n    }\r\n    return 150; \/\/ Bunun sistemden d\u00f6nd\u00fc\u011f\u00fcn\u00fc hayal edin.\r\n}\r\n\r\nfunc sonFatura\u00d6denmi\u015fMi () -&gt; Bool\r\n{\r\n    \/\/ Sisteme son borcu sor\r\n    return false; \/\/ Bunun sistemden d\u00f6nd\u00fc\u011f\u00fcn\u00fc hayal edin.\r\n}\r\n\r\nfunc i\u015flemiOnayla (error: NSErrorPointer) {\r\n    \/\/ Sisteme paray\u0131 aktard\u0131\u011f\u0131n\u0131 ve borcu sildi\u011fini hayal edin.\r\n    \/\/ Bunlar\u0131 yapamad\u0131\u011f\u0131nda geriye false d\u00f6n\u00fcyor.\r\n    if (bir\u015feylerTersGitti) {\r\n        hataOlu\u015ftur(error, hataMesaj\u0131: \"\u0130\u015flem onaylanamad\u0131, sistemde ar\u0131za var.\", kod: 103)\r\n    }\r\n}\r\n\r\nfunc hataOlu\u015ftur (error: NSErrorPointer, hataMesaj\u0131: String, kod: Int)\r\n{\r\n    let userInfo = [NSLocalizedDescriptionKey: hataMesaj\u0131];\r\n    if error != nil {\r\n        error.memory = NSError(domain: \"Koddit\", code: kod, userInfo: userInfo);\r\n    }\r\n}\r\n\r\nlet sonu\u00e7 = suParas\u0131n\u0131Yat\u0131r(miktar: 50);\r\nif sonu\u00e7.hataMesaj\u0131 != nil {\r\n    print (sonu\u00e7.hataMesaj\u0131!);\r\n    \/\/ Para yat\u0131r\u0131lamad\u0131.\r\n} else {\r\n    \/\/ Para yat\u0131r\u0131ld\u0131.\r\n}<\/pre>\n<div style=\"width: 273px\" class=\"wp-caption alignleft\"><img loading=\"lazy\" decoding=\"async\" class=\"lazy\" src=\"https:\/\/blog.koddit.com\/wp-content\/plugins\/wp-images-lazy-loading\/images\/grey.gif\" data-original=\"http:\/\/blog.codinghorror.com\/content\/images\/uploads\/2009\/02\/6a0120a85dcdae970b012877707a45970c-pi.png\" alt=\"\" width=\"263\" height=\"238\" \/><p class=\"wp-caption-text\"><noscript><img loading=\"lazy\" decoding=\"async\" class=\"\" src=\"http:\/\/blog.codinghorror.com\/content\/images\/uploads\/2009\/02\/6a0120a85dcdae970b012877707a45970c-pi.png\" alt=\"\" width=\"263\" height=\"238\" \/><\/noscript> Kodun anla\u015f\u0131l\u0131r olmas\u0131 \u00e7ok \u00f6nemli<\/p><\/div>\n<p>Art\u0131k neyin ters gitti\u011fini bilsek de s\u00fcrekli olarak <em>NSError<\/em> ile u\u011fra\u015fmak zorunday\u0131z, \u00f6zellikle <em>suParas\u0131n\u0131Yat\u0131r<\/em>\u00a0fonksiyonunun i\u00e7i korkun\u00e7. Hele hele daha farkl\u0131 hata mesajlar\u0131 veya hata mesaj\u0131na g\u00f6re i\u015flemler yapmak istedi\u011finizde kodun iyice i\u00e7inden \u00e7\u0131k\u0131lamaz bir hale gelmesi \u00e7ok olas\u0131. Elbette bu kod en ideali de\u011fil ve iyile\u015ftirmek i\u00e7in bir \u015feyler yap\u0131labilir ancak Swift 2 \u00f6ncesi genel olarak takip edece\u011finiz yol da bu. (<em>NSError<\/em>\u00a0kullanmazsan\u0131z\u00a0her fonksiyondan hata kodu veya nil d\u00f6nd\u00fcr\u00fcp onlar\u0131 kontrol edebilirsiniz veya kendi hata s\u0131n\u0131flar\u0131n\u0131z\u0131 olu\u015fturabilirsiniz). Peki Swift 2&#8217;de bu \u00e7ok mu farkl\u0131? try-catch&#8217;in o kadar ciddi bir katk\u0131s\u0131 var m\u0131? Kendiniz karar verin;<\/p>\n<pre class=\"lang:xhtml decode:true\" title=\"Hata d\u00fczeltme ile fatura \u00f6deme sistemi\">var bir\u015feylerTersGitti = false; \/\/ Sahte hata olu\u015fturmak i\u00e7in, yok sayabilirsiniz. \r\n\r\n\/\/\/ 1 - Enumlar \r\nenum SistemHatas\u0131: ErrorType\r\n{\r\n    case ZamanA\u015f\u0131m\u0131, SistemAr\u0131zas\u0131\r\n}\r\nenum \u00d6demeHatas\u0131: ErrorType\r\n{\r\n    case Bor\u00e7Yok, ParaYetersiz (Int)\r\n}\r\n\r\n\/\/\/ 3 - Ana Fonksiyon\r\nfunc suParas\u0131n\u0131Yat\u0131r (miktar miktar: Int) throws -&gt; Int\r\n{\r\n    \/\/\/ 5 - Defer\r\n    defer {\r\n        do {\r\n            try sorguBitir ();\r\n        } catch {\r\n            \/\/ Yeniden dene?\r\n            \/\/ PS: \u0130\u015flem zaten sona erdi o y\u00fczden hatay\u0131 g\u00f6ndermeye gerek yok.\r\n        }\r\n    }\r\n    try sorguBa\u015flat ();\r\n    let bor\u00e7Miktar\u0131 = try bor\u00e7Sorgula();\r\n    if (bor\u00e7Miktar\u0131 &gt; miktar) {\r\n        throw \u00d6demeHatas\u0131.ParaYetersiz(bor\u00e7Miktar\u0131 - miktar);\r\n    }\r\n    return miktar - bor\u00e7Miktar\u0131;\r\n}\r\n\r\n\/\/\/ 2 - Yan Fonksiyonlar \r\nfunc sorguBa\u015flat () throws {\r\n    \/\/ Bu fonksiyonun database e ba\u011flant\u0131 kurmak \/ session ba\u015flatmak\r\n    \/\/ gibi i\u015flemler yapt\u0131\u011f\u0131n\u0131 hayal edin.\r\n    if (bir\u015feylerTersGitti) {\r\n        throw SistemHatas\u0131.ZamanA\u015f\u0131m\u0131;\r\n    }\r\n}\r\n\r\nfunc sorguBitir () throws {\r\n    \/\/ Bu fonksiyonun database le olan ba\u011flant\u0131y\u0131 kapatmak \/ session'\u0131\r\n    \/\/ sona erdirmek  gibi i\u015flemler yapt\u0131\u011f\u0131n\u0131 hayal edin.\r\n    if (bir\u015feylerTersGitti) {\r\n        throw SistemHatas\u0131.ZamanA\u015f\u0131m\u0131;\r\n    }\r\n}\r\n\r\nfunc bor\u00e7Sorgula () throws -&gt; Int\r\n{\r\n    \/\/ E\u011fer fatura \u00f6denmediyse miktar\u0131 d\u00f6nd\u00fcr.\r\n    if (sonFatura\u00d6denmi\u015fMi()) {\r\n        throw \u00d6demeHatas\u0131.Bor\u00e7Yok;\r\n    }\r\n    return 150; \/\/ Bunun sistemden d\u00f6nd\u00fc\u011f\u00fcn\u00fc hayal edin.\r\n}\r\n\r\nfunc sonFatura\u00d6denmi\u015fMi () -&gt; Bool\r\n{\r\n    \/\/ Sisteme son borcu sor\r\n    return false; \/\/ Bunun sistemden d\u00f6nd\u00fc\u011f\u00fcn\u00fc hayal edin.\r\n}\r\n\r\nfunc i\u015flemiOnayla () throws {\r\n    \/\/ Sisteme paray\u0131 aktard\u0131\u011f\u0131n\u0131 ve borcu sildi\u011fini hayal edin.\r\n    \/\/ Bunlar\u0131 yapamad\u0131\u011f\u0131nda geriye false d\u00f6n\u00fcyor.\r\n    if (bir\u015feylerTersGitti) {\r\n        throw SistemHatas\u0131.SistemAr\u0131zas\u0131;\r\n    }\r\n}\r\n\r\n\/\/\/4 - Fonksiyonun kullan\u0131m\u0131\r\ndo {\r\n    try suParas\u0131n\u0131Yat\u0131r (miktar: 50);\r\n} catch \u00d6demeHatas\u0131.Bor\u00e7Yok {\r\n    print (\"Bor\u00e7 yok\");\r\n} catch \u00d6demeHatas\u0131.ParaYetersiz (let miktar) {\r\n    print (\"\\(miktar)\" + \" TL eksik\");\r\n} catch is SistemHatas\u0131 {\r\n    print (\"Sistemde sorun olu\u015ftu\");\r\n    \/\/ Tekrar dene ?\r\n}<\/pre>\n<ol>\n<li><strong>Enumlar<\/strong>: Farkl\u0131 hata tipleri i\u00e7in farkl\u0131 enumlar\u0131m\u0131z var, b\u00f6ylece hata nedenini\u00a0takip etmemiz kolayla\u015f\u0131yor.<\/li>\n<li><strong>Yan Fonksiyonlar:<\/strong> Hata \u00e7\u0131kartma ihtimali olan t\u00fcm fonksiyonlar <em>throws<\/em> olarak tan\u0131ml\u0131 ve hata olu\u015ftu\u011fu anda alakal\u0131 hata tipini f\u0131rlat\u0131yorlar.<\/li>\n<li><strong>Ana Fonksiyon:\u00a0<\/strong>Bu \u00f6rnek i\u00e7in hatalarla <em>suParas\u0131n\u0131Yat\u0131r<\/em> fonksiyonunun de\u011fil onu \u00e7a\u011f\u0131ran kod par\u00e7ac\u0131\u011f\u0131n\u0131n ilgilenmesini istiyoruz, o y\u00fczden <em>suParas\u0131n\u0131Yat\u0131r<\/em> kendisine gelen t\u00fcm hatalar\u0131 iletti\u011fi gibi \u00f6deme s\u0131ras\u0131nda para miktar\u0131 yetmezse\u00a0hata f\u0131rlat\u0131yor.<\/li>\n<li><strong>Fonksiyonun Kullan\u0131m\u0131:\u00a0<\/strong>Fonksiyonu <em>do &#8211; try &#8211; catch<\/em>\u00a0yap\u0131s\u0131 i\u00e7erisinde kullan\u0131p gelen hatalar\u0131 yakal\u0131yoruz. Her hata tipine farkl\u0131 farkl\u0131 tan\u0131m yapabilece\u011fimiz gibi (<em>Bor\u00e7Yok<\/em>&#8211; <em>ParaYetersiz<\/em>) bir hata tipindeki t\u00fcm durumlara ayn\u0131 muameleyi yapabiliyoruz (<em>SistemHatas\u0131<\/em>). \u00a0Gerekti\u011fi noktada enum&#8217;lar\u0131n esnekli\u011finden yararlanarak <em>ParaYetersiz<\/em> durumunda oldu\u011fu gibi enuma\u00a0\u00e7e\u015fitli de\u011ferler\u00a0ili\u015fkilendirmemiz\u00a0de m\u00fcmk\u00fcn.<\/li>\n<li><strong>Defer:\u00a0<\/strong>Baz\u0131 durumlarda fonksiyon\u00a0nas\u0131l sona ererse ersin belli i\u015flemleri yapmak isteriz. \u00d6rne\u011fin bu \u00f6rnek i\u00e7in\u00a0<em>sorguBitir<\/em>\u00a0fonksiyonunu \u00e7al\u0131\u015ft\u0131rarak arkam\u0131z\u0131 \u00a0temiz b\u0131rakmak istiyoruz. <em>defer<\/em>\u00a0tam olarak bu i\u015fe yar\u0131yor, fonksiyonun nas\u0131l bitti\u011finden ba\u011f\u0131ms\u0131z olarak tan\u0131mlanan kodu her seferinde \u00e7al\u0131\u015ft\u0131r\u0131yor. Burada not etmek gereken bir detay var, defer i\u00e7erisinde <em>return<\/em> veya <em>throw<\/em> kullanman\u0131z m\u00fcmk\u00fcn de\u011fil, ancak olu\u015fabilecek hatalar\u0131 yine de yakalayabilir ve duruma g\u00f6re gerekli olan \u015feyleri bu \u00f6rnekte oldu\u011fu gibi yapabilirsiniz.<\/li>\n<\/ol>\n<p>Peki\u00a0hata d\u00fczeltmeyle ilgili bilinmesi gereken ba\u015fka neler var?<\/p>\n<ul>\n<li>Baz\u0131 durumlarda (\u00f6zellikle hata ay\u0131klarken) program\u0131n \u00e7al\u0131\u015fmaya devam etmesindense kendini imha edip kapatmas\u0131n\u0131 tercih edebilirsiniz. Swift&#8217;de bunu hali haz\u0131rda <em>assert<\/em> fonksiyonu ile\u00a0yapmak m\u00fcmk\u00fcn, ancak try-catch bloklar\u0131 i\u00e7in daha h\u0131zl\u0131 bir \u00e7\u00f6z\u00fcm getirilmi\u015f, <em>try<\/em> yerine <em>try!<\/em> kulland\u0131\u011f\u0131n\u0131zda hata olu\u015ftu\u011fu durumlarda uygulama otomatik olarak sonlan\u0131yor. \u00d6rne\u011fin ilk \u00f6rne\u011fimizi <em>do-catch<\/em> olmadan\u00a0<em>try!\u00a0<\/em>ile kullan\u0131rsak uygulama dosyay\u0131 bulamad\u0131\u011f\u0131nda otomatik olarak kapan\u0131r;<\/li>\n<\/ul>\n<pre class=\"lang:xhtml decode:true\" title=\"try!\">let dosya\u0130\u00e7eri\u011fi = try! NSFileManager.defaultManager().contentsOfDirectoryAtPath(\"\/Users\/Koddit\")\r\n<\/pre>\n<ul>\n<li>Swift 2&#8217;nin yeni \u00f6zelliklerinden olan <em>guard<\/em> hata yakalayaca\u011f\u0131n\u0131z durumlarda epey kullan\u0131\u015fl\u0131. Bu yaz\u0131da iyice her \u015feyi birbirine sokmamak i\u00e7in kasten es ge\u00e7sem de ufak bir \u00f6rnek vermi\u015f olay\u0131m;<\/li>\n<\/ul>\n<pre class=\"lang:xhtml decode:true\" title=\"Guard ve Hata D\u00fczeltme\">enum De\u011ferHatas\u0131: ErrorType\r\n{\r\n    case \u0130sim, Adres;\r\n}\r\n\r\nstruct Ma\u011faza {\r\n    var isim: String!;\r\n    var adres: String!;\r\n}\r\n\r\nfunc ma\u011fazaOlu\u015ftur (veri: [String: String]) throws -&gt; Ma\u011faza\r\n{\r\n    guard let isim = veri [\"isim\"] else {\r\n        throw De\u011ferHatas\u0131.\u0130sim;\r\n    }\r\n    guard let adres = veri [\"adres\"] else {\r\n        throw De\u011ferHatas\u0131.Adres;\r\n    }\r\n    return Ma\u011faza(isim: isim, adres: adres);\r\n}\r\n\r\ndo {\r\n    var ma\u011faza = try ma\u011fazaOlu\u015ftur ([\"i\u00e7erik\" : \"yiyecek\"]);\r\n} catch De\u011ferHatas\u0131.\u0130sim {\r\n    print (\"\u0130sim eksk\");\r\n} catch De\u011ferHatas\u0131.Adres {\r\n    print (\"Adres eksik\");\r\n}<\/pre>\n<ul>\n<li>Son olarak belirtmi\u015f olay\u0131m, Objective-C&#8217;deki <em>NSException<\/em> ile Swift&#8217;in try-catch yap\u0131s\u0131 uyumlu de\u011fil, e\u011fer ayn\u0131 projede hem Swift hem Objective-C kullan\u0131yorsan\u0131z\u00a0bunu akl\u0131n\u0131zdan \u00e7\u0131kartmamal\u0131s\u0131n\u0131z.<\/li>\n<\/ul>\n<p><strong>Son not:\u00a0<\/strong>Yaz\u0131daki ilki hari\u00e7 t\u00fcm kod par\u00e7alar\u0131n\u0131 Xcode 7 Playgrounds ile deneyebilirsiniz. Ayr\u0131ca Koddit&#8217;in kod edit\u00f6r\u00fc Swift i\u00e7in\u00a0T\u00fcrk\u00e7e karaktere izin vermedi\u011fi i\u00e7in kod \u00f6rneklerinin \u00e7o\u011funu Swift yerine XHTML ile i\u015faretlemek durumunda kald\u0131m, renksiz oldu biraz kusura bakmay\u0131n.<\/p>","protected":false},"excerpt":{"rendered":"<p>WWDC 2015&#8217;de duyurulan Swift 2&#8217;nin getirdi\u011fi\u00a0en\u00a0kapsaml\u0131 \u00f6zellik yeni bir &#8220;error handling&#8221;\u00a0mekanizmas\u0131. Programda beklenmeyen durumlar\u0131\u00a0yakalay\u0131p gerekli \u015feyleri yapt\u0131\u011f\u0131m\u0131z\u00a0&#8220;error handling&#8221;&#8216;i kaba bir \u015fekilde T\u00fcrk\u00e7e&#8217;ye &#8220;hata y\u00f6netimi&#8221; veya &#8220;hata yakalama&#8221; olarak \u00e7evirebiliriz. Swift 2 \u00f6ncesi yazd\u0131\u011f\u0131n\u0131z program\u0131n u\u00e7 durumlarda\u00a0do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak istiyorsan\u0131z\u00a0izleyebilece\u011finiz iki yol vard\u0131;\u00a0bunlar\u0131n ilki Apple&#8217;\u0131n \u00f6nerdi\u011fi\u00a0NSError s\u0131n\u0131f\u0131n\u0131 kullanmak. Bu y\u00f6ntem ile\u00a0\u015f\u00f6yle bir kod yazman\u0131z gerekliydi; [&hellip;]<\/p>","protected":false},"author":4,"featured_media":1960,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[195],"tags":[20,209,210,198,197],"class_list":["post-2400","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ios","tag-apple","tag-error-handling","tag-hata-yonetimi","tag-ios","tag-swift"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Swift 2 ile Hata Y\u00f6netimi (Error Handling) - Koddit<\/title>\n<meta name=\"description\" content=\"iOS uygulama geli\u015ftirmede kullan\u0131lan Swift&#039;in yeni s\u00fcr\u00fcm\u00fc Swift 2 ile gelen yeni error handling mekanizmas\u0131 ve \u00f6rneklerle kullan\u0131m\u0131\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.koddit.com\/en\/ios\/swift-2-ile-hata-yonetimi-error-handling\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Swift 2 ile Hata Y\u00f6netimi (Error Handling) - Koddit\" \/>\n<meta property=\"og:description\" content=\"iOS uygulama geli\u015ftirmede kullan\u0131lan Swift&#039;in yeni s\u00fcr\u00fcm\u00fc Swift 2 ile gelen yeni error handling mekanizmas\u0131 ve \u00f6rneklerle kullan\u0131m\u0131\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.koddit.com\/en\/ios\/swift-2-ile-hata-yonetimi-error-handling\/\" \/>\n<meta property=\"og:site_name\" content=\"Koddit\" \/>\n<meta property=\"article:published_time\" content=\"2015-06-22T20:34:59+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-07-01T10:38:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.koddit.com\/wp-content\/uploads\/2014\/12\/swift-logo-hero.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Y\u00fccel Uzun\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@u_jell\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Y\u00fccel Uzun\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/\"},\"author\":{\"name\":\"Y\u00fccel Uzun\",\"@id\":\"https:\/\/blog.koddit.com\/#\/schema\/person\/ef65ce1ffefe301b30c55da29f7c6860\"},\"headline\":\"Swift 2 ile Hata Y\u00f6netimi (Error Handling)\",\"datePublished\":\"2015-06-22T20:34:59+00:00\",\"dateModified\":\"2015-07-01T10:38:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/\"},\"wordCount\":1215,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/blog.koddit.com\/#organization\"},\"keywords\":[\"Apple\",\"error handling\",\"hata yonetimi\",\"ios\",\"swift\"],\"articleSection\":[\"iOS\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/\",\"url\":\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/\",\"name\":\"Swift 2 ile Hata Y\u00f6netimi (Error Handling) - Koddit\",\"isPartOf\":{\"@id\":\"https:\/\/blog.koddit.com\/#website\"},\"datePublished\":\"2015-06-22T20:34:59+00:00\",\"dateModified\":\"2015-07-01T10:38:20+00:00\",\"description\":\"iOS uygulama geli\u015ftirmede kullan\u0131lan Swift'in yeni s\u00fcr\u00fcm\u00fc Swift 2 ile gelen yeni error handling mekanizmas\u0131 ve \u00f6rneklerle kullan\u0131m\u0131\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/blog.koddit.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Swift 2 ile Hata Y\u00f6netimi (Error Handling)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.koddit.com\/#website\",\"url\":\"https:\/\/blog.koddit.com\/\",\"name\":\"Koddit\",\"description\":\"Blog\",\"publisher\":{\"@id\":\"https:\/\/blog.koddit.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.koddit.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.koddit.com\/#organization\",\"name\":\"Koddit\",\"url\":\"https:\/\/blog.koddit.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.koddit.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.koddit.com\/wp-content\/uploads\/2023\/04\/koddit-logo.png\",\"contentUrl\":\"https:\/\/blog.koddit.com\/wp-content\/uploads\/2023\/04\/koddit-logo.png\",\"width\":\"176\",\"height\":\"65\",\"caption\":\"Koddit\"},\"image\":{\"@id\":\"https:\/\/blog.koddit.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.koddit.com\/#\/schema\/person\/ef65ce1ffefe301b30c55da29f7c6860\",\"name\":\"Y\u00fccel Uzun\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.koddit.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7fd21d052c1665408ec0cd9b6f20173e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7fd21d052c1665408ec0cd9b6f20173e?s=96&d=mm&r=g\",\"caption\":\"Y\u00fccel Uzun\"},\"description\":\"Y\u00fcksek lisanstan vakit bulabildi\u011finde iOS uygulama geli\u015ftirmekle ilgili bildiklerini yazmaya \u00e7al\u0131\u015f\u0131yor.\",\"sameAs\":[\"https:\/\/de.linkedin.com\/in\/yuceluzun\",\"https:\/\/twitter.com\/u_jell\"],\"url\":\"https:\/\/blog.koddit.com\/en\/author\/yucel\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Swift 2 ile Hata Y\u00f6netimi (Error Handling) - Koddit","description":"iOS uygulama geli\u015ftirmede kullan\u0131lan Swift'in yeni s\u00fcr\u00fcm\u00fc Swift 2 ile gelen yeni error handling mekanizmas\u0131 ve \u00f6rneklerle kullan\u0131m\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.koddit.com\/en\/ios\/swift-2-ile-hata-yonetimi-error-handling\/","og_locale":"en_US","og_type":"article","og_title":"Swift 2 ile Hata Y\u00f6netimi (Error Handling) - Koddit","og_description":"iOS uygulama geli\u015ftirmede kullan\u0131lan Swift'in yeni s\u00fcr\u00fcm\u00fc Swift 2 ile gelen yeni error handling mekanizmas\u0131 ve \u00f6rneklerle kullan\u0131m\u0131","og_url":"https:\/\/blog.koddit.com\/en\/ios\/swift-2-ile-hata-yonetimi-error-handling\/","og_site_name":"Koddit","article_published_time":"2015-06-22T20:34:59+00:00","article_modified_time":"2015-07-01T10:38:20+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/blog.koddit.com\/wp-content\/uploads\/2014\/12\/swift-logo-hero.jpg","type":"image\/jpeg"}],"author":"Y\u00fccel Uzun","twitter_card":"summary_large_image","twitter_creator":"@u_jell","twitter_misc":{"Written by":"Y\u00fccel Uzun","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/#article","isPartOf":{"@id":"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/"},"author":{"name":"Y\u00fccel Uzun","@id":"https:\/\/blog.koddit.com\/#\/schema\/person\/ef65ce1ffefe301b30c55da29f7c6860"},"headline":"Swift 2 ile Hata Y\u00f6netimi (Error Handling)","datePublished":"2015-06-22T20:34:59+00:00","dateModified":"2015-07-01T10:38:20+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/"},"wordCount":1215,"commentCount":1,"publisher":{"@id":"https:\/\/blog.koddit.com\/#organization"},"keywords":["Apple","error handling","hata yonetimi","ios","swift"],"articleSection":["iOS"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/","url":"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/","name":"Swift 2 ile Hata Y\u00f6netimi (Error Handling) - Koddit","isPartOf":{"@id":"https:\/\/blog.koddit.com\/#website"},"datePublished":"2015-06-22T20:34:59+00:00","dateModified":"2015-07-01T10:38:20+00:00","description":"iOS uygulama geli\u015ftirmede kullan\u0131lan Swift'in yeni s\u00fcr\u00fcm\u00fc Swift 2 ile gelen yeni error handling mekanizmas\u0131 ve \u00f6rneklerle kullan\u0131m\u0131","breadcrumb":{"@id":"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.koddit.com\/ios\/swift-2-ile-hata-yonetimi-error-handling\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/blog.koddit.com\/"},{"@type":"ListItem","position":2,"name":"Swift 2 ile Hata Y\u00f6netimi (Error Handling)"}]},{"@type":"WebSite","@id":"https:\/\/blog.koddit.com\/#website","url":"https:\/\/blog.koddit.com\/","name":"Koddit","description":"Blog","publisher":{"@id":"https:\/\/blog.koddit.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.koddit.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/blog.koddit.com\/#organization","name":"Koddit","url":"https:\/\/blog.koddit.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.koddit.com\/#\/schema\/logo\/image\/","url":"https:\/\/blog.koddit.com\/wp-content\/uploads\/2023\/04\/koddit-logo.png","contentUrl":"https:\/\/blog.koddit.com\/wp-content\/uploads\/2023\/04\/koddit-logo.png","width":"176","height":"65","caption":"Koddit"},"image":{"@id":"https:\/\/blog.koddit.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blog.koddit.com\/#\/schema\/person\/ef65ce1ffefe301b30c55da29f7c6860","name":"Y\u00fccel Uzun","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.koddit.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7fd21d052c1665408ec0cd9b6f20173e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7fd21d052c1665408ec0cd9b6f20173e?s=96&d=mm&r=g","caption":"Y\u00fccel Uzun"},"description":"Y\u00fcksek lisanstan vakit bulabildi\u011finde iOS uygulama geli\u015ftirmekle ilgili bildiklerini yazmaya \u00e7al\u0131\u015f\u0131yor.","sameAs":["https:\/\/de.linkedin.com\/in\/yuceluzun","https:\/\/twitter.com\/u_jell"],"url":"https:\/\/blog.koddit.com\/en\/author\/yucel\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/posts\/2400"}],"collection":[{"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/comments?post=2400"}],"version-history":[{"count":0,"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/posts\/2400\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/media\/1960"}],"wp:attachment":[{"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/media?parent=2400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/categories?post=2400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.koddit.com\/en\/wp-json\/wp\/v2\/tags?post=2400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}