-
Notifications
You must be signed in to change notification settings - Fork 0
/
python-hata-yonetimi.html
196 lines (165 loc) · 15.2 KB
/
python-hata-yonetimi.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="utf-8">
<title> Python İstisnalar ve İstisna Yönetimi
</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="0x656e" />
<meta name="description" content="Bildiğiniz gibi yazdığınız program/uygulama bazı yazım yanlışları veya veri girişi kısımlarında gerekli kontroller ve yönetimler yapılmamışsa programınız/uygulamanız bir hata FIRLATARAK sonlanacaktır. Üstelik bu konu zararlı kişilerce kullanılarak son kullanıcıyı mağdur etmeye kadar gidebiliyor. Konu bu haliyle zaten oldukça önemli, bu kısımda yazılımcıya oldukça fazla yük düşmekte. Nedir bunlar …" />
<meta name="keywords" content="Python exceptions, python istisna, python istisna yönetimi, python hata yönetimi, python exceptions managing">
<meta property="article:tag" content="Python exceptions" />
<meta property="article:tag" content="python istisna" />
<meta property="article:tag" content="python istisna yönetimi" />
<meta property="article:tag" content="python hata yönetimi" />
<meta property="article:tag" content="python exceptions managing" />
<link rel="canonical" href="https://enesergun.net/python-hata-yonetimi.html"/>
<meta name="description" content=""/>
<!-- og definitions -->
<meta property="og:type" content="article" />
<meta property="og:url" content="https://enesergun.net/python-hata-yonetimi.html" />
<meta property="og:title" content="Python İstisnalar ve İstisna Yönetimi" />
<meta property="og:description" content="Bildiğiniz gibi yazdığınız program/uygulama bazı yazım yanlışları veya veri girişi kısımlarında gerekli kontroller ve yönetimler yapılmamışsa programınız/uygulamanız bir hata FIRLATARAK..." />
<meta property="og:image" content="https://w0.peakpx.com/wallpaper/212/918/HD-wallpaper-virtual-world-sunset-80s-landscape-retro-theme-tron.jpg" />
<link rel="stylesheet" href="theme/style.css">
<link href="https://enesergun.net/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Enes Ergün Atom Feed" />
</head>
<body>
<div class="container">
<header class="blog-header">
<h1><a href="https://enesergun.net" class="glitch glow" data-text="Enes Ergün">Enes Ergün</a></h1>
<p> Chaotic Neutral / ISTP-T - 30 lvl rogue - Cyber Security </p>
<nav>
<a href="https://enesergun.net/">INDEX</a>
<a href="https://enesergun.net/archives">ARCHIVES</a>
<a href="https://enesergun.net/categories">CATEGORIES</a>
</nav>
</header>
<div class="post">
<header>
<h1>Python İstisnalar ve İstisna Yönetimi</h1>
<p class="date">Written on <time datetime="2018-05-08T23:12:00+03:00">May 08, 2018</time></p>
</header>
<article>
<p>Bildiğiniz gibi yazdığınız program/uygulama bazı yazım yanlışları veya veri girişi kısımlarında gerekli kontroller ve yönetimler yapılmamışsa programınız/uygulamanız bir hata FIRLATARAK sonlanacaktır. Üstelik bu konu zararlı kişilerce kullanılarak son kullanıcıyı mağdur etmeye kadar gidebiliyor. Konu bu haliyle zaten oldukça önemli, bu kısımda yazılımcıya oldukça fazla yük düşmekte. Nedir bunlar?</p>
<ol>
<li>Yazdığı kodların genel istisna durumlarını yönetmelidir.</li>
<li>Kullanıcı girişlerini kontrol etmelidir. ( Her konuda edilmeli )</li>
<li>Zararsız kullanıcının yerine zararlı bir kişinin bu girdi kısımlarına neler girebileceğini tahmin edebilmedir.</li>
</ol>
<p>Şu anlık aklıma gelen bu kadar ama eminim fazlası da vardır. Bu konu hakkında beni yeşillendirebilirsiniz. Evet istisna yönetimi bu kadar önemliyken ben de bu konu hakkında yazmak istedim. Peki Python'da istisnalar nedir? Nasıl yönetilir? Hadi başlayalım.</p>
<h2>Python'da istisnalar</h2>
<p>Python'da istisnalar Exception ile yönetilir. Python üstünde Built-in olarak gelen bir sürü istisna yöntemi ve yönetimi vardır. Bunların listesine <a href="https://docs.python.org/3/library/exceptions.html">Built-in Exceptions</a> linkine tıklayarak ulaşabilirsiniz. Kod olaraksa en basit şekilde aşağıda ki gibi bir kullanımı vardır.</p>
<div class="highlight"><pre><span></span><code><span class="n">try</span><span class="p">:</span><span class="w"> </span><span class="c1"># Çalışacak kodunuz.</span><span class="w"></span>
<span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="mi">0</span><span class="o">/</span><span class="mi">0</span><span class="p">)</span><span class="w"></span>
<span class="n">except</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nb">print</span><span class="p">(</span><span class="s2">"Hata var"</span><span class="p">)</span><span class="w"></span>
</code></pre></div>
<p>veya aşağıda ki gibi bir kullanım daha uygundur. Çünkü yukarıda ki kod bloğunda ne hata verirse versin hata var yazacaktır.</p>
<div class="highlight"><pre><span></span><code><span class="k">try</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">print</span><span class="o">(</span><span class="mi">0</span><span class="o">/</span><span class="mi">0</span><span class="o">)</span><span class="w"></span>
<span class="n">except</span><span class="w"> </span><span class="n">ZeroDivisionError</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">print</span><span class="o">(</span><span class="s2">"Sıfırı sıfıra bölüyon"</span><span class="o">)</span><span class="w"></span>
</code></pre></div>
<p>Yukarıda ki kod bloğunda kullandığımız ZeroDivisionError farkettiğiniz üzere bir built-in bir istisnadır.</p>
<p>Peki karşımıza gelecek bu istisnaları nasıl yöneteceğiz?</p>
<p>Örnek bir kod bloğunu aşağıda görebilirsiniz.</p>
<div class="highlight"><pre><span></span><code><span class="nv">liste</span> <span class="o">=</span> [<span class="nv">i</span> <span class="k">for</span> <span class="nv">i</span> <span class="nv">in</span> <span class="nv">range</span><span class="ss">(</span><span class="mi">0</span>,<span class="mi">10</span><span class="ss">)</span>]
<span class="nv">try</span>:
<span class="k">for</span> <span class="nv">i</span> <span class="nv">in</span> <span class="nv">liste</span>:
<span class="nv">print</span><span class="ss">(</span><span class="nv">int</span><span class="ss">(</span><span class="nv">i</span><span class="ss">)</span><span class="o">/</span><span class="mi">0</span><span class="ss">)</span>
<span class="nv">except</span> <span class="nv">ZeroDivisionError</span> <span class="nv">as</span> <span class="nv">hata</span>:
<span class="nv">print</span><span class="ss">(</span><span class="nv">hata</span><span class="ss">)</span>
</code></pre></div>
<p>Burada hatayı gördük ve bununla ilgili ekrana bastırdık. Peki bu kadarla mı sınırlıyız? Tabi ki de hayır. Bu kısımda karşımıza 3 deyim daha çıkıyor.</p>
<p>Bu deyimler:
1. Raise
2. Assert
3. Else
4. Finally</p>
<p>Peki bunlar ne işe yarar? Kısaca açıklayacak olursam:</p>
<p><strong>Raise</strong>
Raise bize istisna çıktılarını tanımlamamızı sağlar. Nasıl yani derseniz şu şekilde. Bir yazılımın sadece stringler üzerinde işlem yaptığını düşünün buraya integer bir değer girdiğimizde bize TypeError verecektir. Fakat burada Error çıktısı son kullanıcı için anlamsız olabilir veya bunu değiştirmek isteyebilirsiniz. Base bir exception üzerinden Raise ile bunu yapabilirsiniz. Aslında raise bize istediğimiz zaman bir istisna fırlatmamıza olanak sağlar. Örnek:</p>
<div class="highlight"><pre><span></span><code><span class="nv">i</span> <span class="o">=</span> <span class="mi">5</span>
<span class="k">if</span> <span class="nv">type</span><span class="ss">(</span><span class="nv">i</span><span class="ss">)</span> <span class="nv">is</span> <span class="nv">int</span>:
<span class="nv">raise</span> <span class="nv">TypeError</span><span class="ss">(</span><span class="s2">"</span><span class="s">Integer lan bu</span><span class="s2">"</span><span class="ss">)</span>
</code></pre></div>
<p><strong>Assert</strong>
Bir modül yazdınız mesela bu modül sadece Linux'da çalışsın. Bunun kontrolünü assert ile kontrol ederek gerekli bir istisnayı sağlayabilirsiniz. Yazacağınız 1 satırlık assert ile bu kontrolü sağlayabilirsiniz. Örnek kod:</p>
<div class="highlight"><pre><span></span><code>def meminfo():
assert ('linux' in sys.platform)
ac = open("/proc/meminfo")
meminfo()
</code></pre></div>
<p>Şimdi yukarıda ki kod da eğer sisteminiz Linuxsa bu kodu çalıştıracaktır. Fakat sisteminiz linux değilse sizlere istisna olarak AssertionError dönecektir. Peki bu durumda biz ne yapacağız?</p>
<div class="highlight"><pre><span></span><code><span class="k">try</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">meminfo</span><span class="o">()</span><span class="w"></span>
<span class="n">except</span><span class="w"> </span><span class="n">AssertionError</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">print</span><span class="o">(</span><span class="s2">"Windows haram"</span><span class="o">)</span><span class="w"></span>
</code></pre></div>
<p>Gördüğünüz gibi işletim sistemi kontrolünü sağlamış olduk.</p>
<p><strong>Else</strong></p>
<p>Else ise muazzam bir özelliğe sahiptir. Nedir bu ? Bir üst örnekte yapmış olduğumuz kodu hatırlayın. Eğer Linux sisteminde çalıştırıyorsak bize hata vermeyecekti. Peki hata vermedi o zaman? Finally kullanabiliriz evet haklısınız fakat farklı bir istisna yönetimi de koymak istiyorum. Mesela hata vermedi ve ben bu dosyayı okudum ama daha sonra parse etmek istiyorum? İşte burada else koşulunun içerisine yazdığımız kod ile bunu kontrol edebiliyoruz. </p>
<div class="highlight"><pre><span></span><code><span class="k">try</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">meminfo</span><span class="o">()</span><span class="w"></span>
<span class="n">except</span><span class="w"> </span><span class="n">AssertionError</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">print</span><span class="o">(</span><span class="s2">"Windows haram"</span><span class="o">)</span><span class="w"></span>
<span class="k">else</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="k">try</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">dosya</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">open</span><span class="o">(</span><span class="s2">"memoryokuyucu.txt"</span><span class="o">,</span><span class="s2">"a"</span><span class="o">)</span><span class="w"></span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">meminfo</span><span class="o">():</span><span class="w"></span>
<span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="n">i</span><span class="o">.</span><span class="na">replace</span><span class="o">(</span><span class="s2">"kb"</span><span class="o">,</span><span class="s2">"kilobayt"</span><span class="o">)</span><span class="w"></span>
<span class="w"> </span><span class="n">dosya</span><span class="o">.</span><span class="na">write</span><span class="o">(</span><span class="n">i</span><span class="o">)</span><span class="w"></span>
<span class="w"> </span><span class="n">except</span><span class="w"> </span><span class="n">FileNotFoundError</span><span class="o">:</span><span class="w"></span>
<span class="w"> </span><span class="n">print</span><span class="o">(</span><span class="s2">"Memory okuyucu diye bir dosya yok"</span><span class="o">)</span><span class="w"></span>
</code></pre></div>
<p>Örnek sanırım yeterince açıklayıcı olmuştur.</p>
<p><strong> Finally </strong></p>
<p>İşte geldik en güzel terime Finally. Finally şu işe yaramaktadır. İstisna yönetimlerinden sonra kodumuza ne yapacağımızı söyler. Yani her istisnayı geçti bu kod artık ne yapalım demektir? Burada hiç bir hata almadım veya sürekli çalışsın dediğiniz kodlarınız durabilir.</p>
<p>Finally konusunda örnek yazmadım zaten yeterince açık olduğu için.</p>
<p>Yazımı okuduğunuz için teşekkür ederim. Bir hatam veya yanlışım olmuş ise yeşillendirirseniz sevinirim.
<strong>Unutmadan</strong> bu haftanın şarkısını aşağıda paylaşıyorum.</p>
<p><a href="https://www.youtube.com/watch?v=nPglNjxVHiM"><img alt="Skunk Anansie - Weak" src="https://img.youtube.com/vi/nPglNjxVHiM/0.jpg"></a></p>
</article>
<footer>
<p>This entry is posted in <a href="https://enesergun.net/category/python.html">python</a>.</p>
</footer>
<div class="comments">
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = '0x656e';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
</div>
<footer class="blog-footer">
<ul class="nav">
<li><a href="https://devilinside.me/"> Eşelyon</a></li>
<li><a href="https://medium.com/@brkalbyrk"> Berk Albayrak</a></li>
<li><a href="https://ahmtglr.wordpress.com/"> Ahmet Güler</a></li>
<li><a href="https://kaganisildak.com/"> Kağan Işıldak</a></li>
<li><a href="https://eybisi.run/"> Eybisi</a></li>
<li><a href="https://onur.im/"> Onur Aslan</a></li>
<li><a href="https://canyoupwn.me/"> Canyoupwn.me</a></li>
<li><a href="https://www.oguzozkeroglu.com"> Oğuz Özkeroğlu</a></li>
<li><a href="https://aligoren.com"> Ali Gören</a></li>
<li><a href="https://0xf61.gitlab.io/"> Emir Kurt</a></li>
<br>
<li><a href="www.twitter.com/eness_ergun">Twitter</a></li>
<li><a href="[email protected]">Mail</a></li>
</ul>
<p class="disclaimer">
Built with <a href="http://getpelican.com">Pelican</a>, and <a href="https://github.com/ka1nsha/MBPelican">MB Pelican</a> theme.
</p>
</footer>
</div>
</body>
</html>