{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Hata Yakalama - try,except,finally\n", "Bu konuda programlarımızda hata verebilecek kodları yakalayabildiğimiz try,except,finally bloklarını ve fonksiyonlarda kendi hatalarımızı nasıl fırlatacağımızı öğreneceğiz.\n", "\n", "### try , except blokları\n", "\n", "\n", "try ,except bloklarının yapısı şu şekildedir;\n", "\n", " try:\n", " \n", " Hata çıkarabilecek kodlar buraya yazılıyor.\n", " Eğer hata çıkarsa program uygun olan except bloğuna girecek.\n", " Hata oluşursa try bloğunun geri kalanındaki işlemler çalışmayacak.\n", " except Hata1:\n", " Hata1 oluştuğunda burası çalışacak.\n", " except Hata2:\n", " Hata2 oluştuğunda burası çalışacak.\n", " \n", " //\n", " //\n", " //\n", "Hemen try , except ile ilgili örneklerimize geçelim. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Örnek 1" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "invalid literal for int() with base 10: '324234dsadsad'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"324234dsadsad\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;31m# Burası ValueError hatası veriyor.\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mValueError\u001b[0m: invalid literal for int() with base 10: '324234dsadsad'" ] } ], "source": [ "a = int(\"324234dsadsad\") # Burası ValueError hatası veriyor." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hata oluştu\n", "Bloklar sona erdi\n" ] } ], "source": [ "try:\n", " \n", " a = int(\"324234dsadsad\") # Burası ValueError hatası veriyor.\n", " print(\"Program burada\")\n", "except: # Hatayı belirtmezsek bütün hatalar bu kısma giriyor.\n", " print(\"Hata oluştu\") # Burası çalışır.\n", " \n", "print(\"Bloklar sona erdi\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Burada **a = int(\"324234sadsad\")** kodu sıkıntı verdiği için program bu bloktan çıkarak direk except bloğuna girdi ve \"Hata oluştu\" yazdı. try ,except bloğu bitince program ekrana \"Bloklar sona erdi\" yazdırdı." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Program burada\n", "Bloklar sona erdi\n" ] } ], "source": [ "try:\n", " \n", " a = int(\"324234\") # Burası normal çalışıyor\n", " print(\"Program burada\")\n", "except ValueError: # Hatayı belirtirsek ValueError hatası bu kısma giriyor.\n", " print(\"Hata oluştu\") # Hata olmadığı için çalışmadı.\n", " \n", "print(\"Bloklar sona erdi\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Örnek 2\n", "\n", "Şimdi de 2 adet sıkıntı çıkaran kodumuz bulunsun. Birincisi ZeroDivisionError , diğeri ValueError hatası." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "invalid literal for int() with base 10: '32434aaa'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"32434aaa\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mValueError\u001b[0m: invalid literal for int() with base 10: '32434aaa'" ] } ], "source": [ "a = int(\"32434aaa\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "ename": "ZeroDivisionError", "evalue": "division by zero", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mZeroDivisionError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m/\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mZeroDivisionError\u001b[0m: division by zero" ] } ], "source": [ "print(2 / 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Şimdi de bu hataları yakalamaya çalışalım." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sayı1:12\n", "Sayı2:12sdasdad\n", "Lütfen inputları doğru girin.\n" ] } ], "source": [ "try:\n", " a = int(input(\"Sayı1:\"))\n", " b = int(input(\"Sayı2:\")) # Hata burada oluşuyor. ValueError'a bloğuna giriyoruz. \n", " print(a / b)\n", "except ValueError:\n", " print(\"Lütfen inputları doğru girin.\")\n", "except ZeroDivisionError:\n", " print(\"Bir sayı 0'a bölünemez.\")" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sayı1:12\n", "Sayı2:0\n", "Bir sayı 0'a bölünemez.\n" ] } ], "source": [ "try:\n", " a = int(input(\"Sayı1:\"))\n", " b = int(input(\"Sayı2:\"))\n", " print(a / b) # Hata burada oluşuyor. ZeroDivisionError'a bloğuna giriyoruz.\n", "except ValueError:\n", " print(\"Lütfen inputları doğru girin.\")\n", "except ZeroDivisionError:\n", " print(\"Bir sayı 0'a bölünemez.\")\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sayı1:12\n", "Sayı2:34\n", "0.35294117647058826\n" ] } ], "source": [ "try:\n", " a = int(input(\"Sayı1:\"))\n", " b = int(input(\"Sayı2:\")) # Hata verecek kod bulunmuyor.\n", " print(a / b) \n", "except ValueError:\n", " print(\"Lütfen inputları doğru girin.\")\n", "except ZeroDivisionError:\n", " print(\"Bir sayı 0'a bölünemez.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İstersek bu iki hatanın aynı except bloğuna girmesini sağlayabiliriz." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sayı1:12\n", "Sayı2:213213sadsadsadasd\n", "ZeroDivision veya ValueError hatası\n" ] } ], "source": [ "try:\n", " a = int(input(\"Sayı1:\"))\n", " b = int(input(\"Sayı2:\"))\n", " print(a / b) \n", "except (ValueError,ZeroDivisionError):\n", " print(\"ZeroDivision veya ValueError hatası\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sayı1:12\n", "Sayı2:0\n", "ZeroDivision veya ValueError hatası\n" ] } ], "source": [ "try:\n", " a = int(input(\"Sayı1:\"))\n", " b = int(input(\"Sayı2:\")) \n", " print(a / b) \n", "except (ValueError,ZeroDivisionError):\n", " print(\"ZeroDivision veya ValueError hatası\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İşte burada gördüğümüz gibi bir kodda herhangi bir hata olduğunda try,except blokları ile hataları yakalayabiliyoruz." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### try,except,finally blokları" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bazen programlarımızda her durumda mutlaka çalışmasını istediğimiz kodlar bulunabilir.Bunun için biz kendi try,except bloklarına ek olarak bir tane **finally** bloğu ekleyebiliriz. **finally** blokları hata olması veya olmaması durumunda mutlaka çalışacaktır. Yapısı şu şekildedir;\n", "\n", " try:\n", " \n", " Hata çıkarabilecek kodlar buraya yazılıyor.\n", " Eğer hata çıkarsa program uygun olan except bloğuna girecek.\n", " Hata oluşursa try bloğunun geri kalanındaki işlemler çalışmayacak.\n", " except Hata1:\n", " Hata1 oluştuğunda burası çalışacak.\n", " except Hata2:\n", " Hata2 oluştuğunda burası çalışacak.\n", " \n", " //\n", " //\n", " //\n", " finally:\n", " Mutlaka çalışması gereken kodlar buraya yazılacak.\n", " Bu blok her türlü çalışacak.\n", " \n", " \n", "Hemen basit bir örnek yazalım." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sayı1:12\n", "Sayı2:213213aaaaa\n", "Lütfen inputları doğru girin.\n", "Her durumda çalışıyorum.\n" ] } ], "source": [ "try:\n", " a = int(input(\"Sayı1:\"))\n", " b = int(input(\"Sayı2:\"))\n", " print(a / b) # Hata burada oluşuyor. ZeroDivisionError'a bloğuna giriyoruz.\n", "except ValueError:\n", " print(\"Lütfen inputları doğru girin.\")\n", "except ZeroDivisionError:\n", " print(\"Bir sayı 0'a bölünemez.\")\n", "finally:\n", " print(\"Her durumda çalışıyorum.\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sayı1:12\n", "Sayı2:0\n", "Bir sayı 0'a bölünemez.\n", "Her durumda çalışıyorum.\n" ] } ], "source": [ "try:\n", " a = int(input(\"Sayı1:\"))\n", " b = int(input(\"Sayı2:\"))\n", " print(a / b) # Hata burada oluşuyor. ZeroDivisionError'a bloğuna giriyoruz.\n", "except ValueError:\n", " print(\"Lütfen inputları doğru girin.\")\n", "except ZeroDivisionError:\n", " print(\"Bir sayı 0'a bölünemez.\")\n", "finally:\n", " print(\"Her durumda çalışıyorum.\")\n", " " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sayı1:12\n", "Sayı2:3\n", "4.0\n", "Her durumda çalışıyorum.\n" ] } ], "source": [ "try:\n", " a = int(input(\"Sayı1:\"))\n", " b = int(input(\"Sayı2:\"))\n", " print(a / b) # Hata burada oluşuyor. ZeroDivisionError'a bloğuna giriyoruz.\n", "except ValueError:\n", " print(\"Lütfen inputları doğru girin.\")\n", "except ZeroDivisionError:\n", " print(\"Bir sayı 0'a bölünemez.\")\n", "finally:\n", " print(\"Her durumda çalışıyorum.\")\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Hata fırlatmak\n", "\n", "Bazen kendi yazdığımız fonksiyonlar yanlış kullanılırsa kendi hatalarımızı üretip Pythonda bu hataları fırlatabiliriz. Bunun içinde **raise** anahtar kelimesini kullanacağız. Hata fırlatma şu şekilde yapılabilmektedir;\n", " \n", " raise HataAdı(opsiyonel hata mesajı)\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Verilen string'i ters çevirmek\n", "def terscevir(s):\n", " if (type(s) != str):\n", " raise ValueError(\"Lütfen doğru bir input girin.\")\n", " else:\n", " return s[::-1]\n", " " ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nohtyP\n" ] } ], "source": [ "print(terscevir(\"Python\")) # Hata vermiyor." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "Lütfen doğru bir input girin.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mterscevir\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m12\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m\u001b[0m in \u001b[0;36mterscevir\u001b[1;34m(s)\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mterscevir\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mif\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ms\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m!=\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Lütfen doğru bir input girin.\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0ms\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: Lütfen doğru bir input girin." ] } ], "source": [ "print(terscevir(12))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Bu fonksiyondan fırlatılan hatayı da try,except bloklarıyla yakalayabiliriz." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fonksiyonda bir hata oluştu.\n" ] } ], "source": [ "try:\n", " print(terscevir(12))\n", "except ValueError:\n", " print(\"Fonksiyonda bir hata oluştu.\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "İşte Pythonda hata yakalama konusu bu kadar ! Artık hata yakalamayı kullanarak programlarımızı daha güvenli yazabiliriz. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }