{"id":36602,"date":"2025-12-20T13:41:00","date_gmt":"2025-12-20T10:41:00","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36602"},"modified":"2025-12-20T13:41:00","modified_gmt":"2025-12-20T10:41:00","slug":"servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/","title":{"rendered":"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama"},"content":{"rendered":"<h2>Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama<\/h2>\n<p><body><\/p>\n<h2>Giri\u015f<\/h2>\n<p>Web uygulamalar\u0131 g\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131n\u0131n temel ta\u015flar\u0131ndan biridir ve bu uygulamalar\u0131n kararl\u0131, g\u00fcvenilir ve kullan\u0131c\u0131 dostu olmas\u0131 b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Java tabanl\u0131 web uygulamalar\u0131 geli\u015ftirmede Servlet&#8217;ler, sunucu taraf\u0131 mant\u0131\u011f\u0131n\u0131 uygulamak i\u00e7in g\u00fc\u00e7l\u00fc bir API sunar. Ancak, her yaz\u0131l\u0131mda oldu\u011fu gibi, Servlet tabanl\u0131 uygulamalarda da \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131 ve istisnalar ka\u00e7\u0131n\u0131lmazd\u0131r. Bu istisnalar\u0131n do\u011fru bir \u015fekilde y\u00f6netilmesi, uygulaman\u0131n \u00e7\u00f6kmesini engellemek, kullan\u0131c\u0131ya anlaml\u0131 geri bildirimler sunmak ve geli\u015ftiricilerin sorunlar\u0131 daha kolay te\u015fhis etmesini sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Bu makale, Servlet istisna ve hata y\u00f6netiminin temel prensiplerini, \u00e7e\u015fitli mekanizmalar\u0131n\u0131 ve pratik bir \u00f6rnek uygulama \u00fczerinden nas\u0131l hayata ge\u00e7irilece\u011fini detayl\u0131 bir \u015fekilde ele alacakt\u0131r. Amac\u0131m\u0131z, geli\u015ftiricilere sa\u011flam ve hataya dayan\u0131kl\u0131 Servlet uygulamalar\u0131 olu\u015fturmalar\u0131 i\u00e7in kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h2>Servlet \u0130stisna Y\u00f6netiminin \u00d6nemi<\/h2>\n<p>Bir web uygulamas\u0131nda istisna y\u00f6netimi, sadece kodun &#8220;\u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak&#8221;tan \u00e7ok daha fazlas\u0131n\u0131 ifade eder. Kapsaml\u0131 ve iyi d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f bir hata y\u00f6netim stratejisi, uygulaman\u0131n genel kalitesini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini do\u011frudan etkiler.<\/p>\n<h3>Uygulama Kararl\u0131l\u0131\u011f\u0131 ve G\u00fcvenilirli\u011fi<\/h3>\n<p>Do\u011fru istisna y\u00f6netimi, bir hatan\u0131n t\u00fcm uygulamay\u0131 veya sunucuyu \u00e7\u00f6kertmesini engeller. Beklenmedik durumlar ortaya \u00e7\u0131kt\u0131\u011f\u0131nda, uygulama gracefully bir \u015fekilde bu durumu ele alarak \u00e7al\u0131\u015fmaya devam edebilir veya en az\u0131ndan kontroll\u00fc bir \u015fekilde hata mesaj\u0131 sunarak kapanabilir. Bu, kullan\u0131c\u0131lar\u0131n kesintisiz bir deneyim ya\u015famas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Kullan\u0131c\u0131 Deneyimi<\/h3>\n<p>Son kullan\u0131c\u0131n\u0131n bir hata ile kar\u015f\u0131la\u015ft\u0131\u011f\u0131nda ne g\u00f6rd\u00fc\u011f\u00fc, uygulaman\u0131n alg\u0131lanan kalitesini do\u011frudan etkiler. Sunucu taraf\u0131ndan \u00fcretilen ham y\u0131\u011f\u0131n izleri (stack traces) veya anlams\u0131z hata kodlar\u0131 yerine, kullan\u0131c\u0131 dostu ve a\u00e7\u0131klay\u0131c\u0131 hata sayfalar\u0131 sunmak, kullan\u0131c\u0131n\u0131n hayal k\u0131r\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r ve uygulaman\u0131za olan g\u00fcvenini art\u0131r\u0131r.<\/p>\n<h3>Hata Te\u015fhisi ve Bak\u0131m Kolayl\u0131\u011f\u0131<\/h3>\n<p>Geli\u015ftiriciler i\u00e7in, istisnalar\u0131n do\u011fru bir \u015fekilde loglanmas\u0131 ve anlaml\u0131 hata mesajlar\u0131 \u00fcretilmesi, sorunlar\u0131 h\u0131zl\u0131 bir \u015fekilde te\u015fhis etme ve giderme s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r. \u00dcretim ortam\u0131nda ortaya \u00e7\u0131kan hatalar\u0131n k\u00f6k nedenini bulmak, iyi bir hata y\u00f6netimi stratejisi olmadan son derece zor olabilir.<\/p>\n<h3>G\u00fcvenlik<\/h3>\n<p>Hata mesajlar\u0131 bazen uygulaman\u0131n i\u00e7 yap\u0131s\u0131, veritaban\u0131 \u015femas\u0131 veya sunucu yolu gibi hassas bilgileri if\u015fa edebilir. Kapsaml\u0131 hata y\u00f6netimi, bu t\u00fcr bilgilerin son kullan\u0131c\u0131ya veya potansiyel k\u00f6t\u00fc niyetli akt\u00f6rlere s\u0131zmas\u0131n\u0131 engelleyerek uygulaman\u0131n g\u00fcvenlik duru\u015funu g\u00fc\u00e7lendirir.<\/p>\n<h2>Servlet&#8217;lerde \u0130stisna T\u00fcrleri<\/h2>\n<p>Java&#8217;da oldu\u011fu gibi Servlet ortam\u0131nda da istisnalar temel olarak iki ana kategoriye ayr\u0131l\u0131r: kontrol edilen (checked) ve \u00e7al\u0131\u015fma zaman\u0131 (runtime) istisnalar\u0131. Servlet API&#8217;si ayr\u0131ca kendi \u00f6zel istisna s\u0131n\u0131flar\u0131n\u0131 da tan\u0131mlar.<\/p>\n<h3>\u00c7al\u0131\u015fma Zaman\u0131 \u0130stisnalar\u0131 (Runtime Exceptions)<\/h3>\n<p><code>java.lang.RuntimeException<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreyen istisnalard\u0131r. Bunlar genellikle programlama hatalar\u0131n\u0131 veya mant\u0131ksal kusurlar\u0131 g\u00f6sterir ve derleyici taraf\u0131ndan kontrol edilmezler. Yani, bu istisnalar\u0131 yakalamak veya bildirmek zorunlu de\u011fildir, ancak iyi bir pratik olarak yakalanmalar\u0131 \u00f6nerilir.<br \/>\n\u00d6rnekler: <code>NullPointerException<\/code>, <code>ArrayIndexOutOfBoundsException<\/code>, <code>IllegalArgumentException<\/code>, <code>ArithmeticException<\/code> (\u00f6rne\u011fin, s\u0131f\u0131ra b\u00f6lme).<\/p>\n<h3>Kontrol Edilen \u0130stisnalar (Checked Exceptions)<\/h3>\n<p><code>java.lang.Exception<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreyen ancak <code>RuntimeException<\/code> olmayan istisnalard\u0131r. Bu istisnalar\u0131n derleyici taraf\u0131ndan yakalanmas\u0131 (<code>try-catch<\/code> blo\u011fu ile) veya \u00e7a\u011fr\u0131 yapan metoda bildirilmesi (<code>throws<\/code> anahtar kelimesi ile) zorunludur. Genellikle d\u0131\u015f kaynaklarla (dosya G\/\u00c7, veritaban\u0131 eri\u015fimi, a\u011f ileti\u015fimi) etkile\u015fimde bulunurken ortaya \u00e7\u0131karlar.<br \/>\n\u00d6rnekler: <code>IOException<\/code>, <code>SQLException<\/code>, <code>FileNotFoundException<\/code>.<\/p>\n<h3>Servlet API \u0130stisnalar\u0131<\/h3>\n<p>Servlet API, Servlet&#8217;lere \u00f6zg\u00fc baz\u0131 istisna s\u0131n\u0131flar\u0131 tan\u0131mlar:<\/p>\n<h4>ServletException<\/h4>\n<p>Servlet&#8217;in i\u015flenmesi s\u0131ras\u0131nda genel bir hata olu\u015ftu\u011funu g\u00f6steren temel istisna s\u0131n\u0131f\u0131d\u0131r. Genellikle, bir Servlet i\u00e7inde meydana gelen di\u011fer istisnalar\u0131 sarmalamak (wrap) i\u00e7in kullan\u0131l\u0131r ve bu istisnalar\u0131 Servlet kapsay\u0131c\u0131s\u0131na (container) bildirir.<\/p>\n<h4>UnavailableException<\/h4>\n<p>Bir Servlet&#8217;in ge\u00e7ici veya kal\u0131c\u0131 olarak kullan\u0131lamaz hale geldi\u011fini belirtir. Bu istisna f\u0131rlat\u0131ld\u0131\u011f\u0131nda, Servlet kapsay\u0131c\u0131s\u0131 bu Servlet&#8217;e yap\u0131lan sonraki istekleri belirli bir s\u00fcre veya s\u00fcresiz olarak reddeder.<\/p>\n<h2>\u0130stisna Y\u00f6netimi Mekanizmalar\u0131<\/h2>\n<p>Servlet uygulamalar\u0131nda istisnalar\u0131 y\u00f6netmek i\u00e7in \u00e7e\u015fitli mekanizmalar mevcuttur. Bu mekanizmalar, istisnan\u0131n nerede olu\u015ftu\u011funa ve nas\u0131l ele al\u0131nmas\u0131 gerekti\u011fine ba\u011fl\u0131 olarak birlikte veya ayr\u0131 ayr\u0131 kullan\u0131labilir.<\/p>\n<h3><code>try-catch-finally<\/code> Bloklar\u0131<\/h3>\n<p>Java&#8217;daki en temel istisna y\u00f6netim mekanizmas\u0131d\u0131r. Bir Servlet&#8217;in <code>doGet()<\/code>, <code>doPost()<\/code> veya di\u011fer metotlar\u0131 i\u00e7inde, hata potansiyeli olan kod bloklar\u0131n\u0131 <code>try<\/code> blo\u011funa alarak, olu\u015fabilecek istisnalar\u0131 <code>catch<\/code> bloklar\u0131nda yakalayabilir ve i\u015fleyebilirsiniz. <code>finally<\/code> blo\u011fu ise istisna olu\u015fsa da olu\u015fmasa da her zaman \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gereken kodlar (\u00f6rne\u011fin kaynaklar\u0131 kapatma) i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-java\">import java.io.IOException;\nimport java.io.PrintWriter;\nimport javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n@WebServlet(\"\/tryCatchExample\")\npublic class TryCatchExampleServlet extends HttpServlet {\n    protected void doGet(HttpServletRequest request, HttpServletResponse response)\n            throws ServletException, IOException {\n        response.setContentType(\"text\/html\");\n        PrintWriter out = response.getWriter();\n        out.println(\"<html><body>\");\n\n        try {\n            String param = request.getParameter(\"sayi\");\n            int sayi = Integer.parseInt(param); \/\/ NumberFormatException f\u0131rlatabilir\n            int sonuc = 100 \/ sayi; \/\/ ArithmeticException f\u0131rlatabilir (sayi=0 ise)\n            out.println(\"Sonu\u00e7: \" + sonuc);\n        } catch (NumberFormatException e) {\n            out.println(\"<p style='color:red;'>Hata: Ge\u00e7ersiz say\u0131 format\u0131! L\u00fctfen bir tamsay\u0131 girin.<\/p>\");\n            \/\/ Loglama yap\u0131labilir: Logger.getLogger(getClass().getName()).log(Level.WARNING, \"Ge\u00e7ersiz say\u0131 format\u0131\", e);\n        } catch (ArithmeticException e) {\n            out.println(\"<p style='color:red;'>Hata: S\u0131f\u0131ra b\u00f6lme hatas\u0131!<\/p>\");\n            \/\/ Loglama yap\u0131labilir\n        } catch (Exception e) { \/\/ Genel hata yakalay\u0131c\u0131\n            out.println(\"<p style='color:red;'>Beklenmeyen bir hata olu\u015ftu: \" + e.getMessage() + \"<\/p>\");\n            throw new ServletException(\"Servlet i\u00e7inde bir hata olu\u015ftu\", e); \/\/ Kapsay\u0131c\u0131ya bildir\n        } finally {\n            out.println(\"<p>\u0130\u015flem tamamland\u0131.<\/p>\");\n            out.println(\"<\/body><\/html>\");\n            out.close();\n        }\n    }\n}<\/code><\/pre>\n<h3><code>throws<\/code> Bildirimi<\/h3>\n<p>Bir metot i\u00e7inde kontrol edilen bir istisna olu\u015ftu\u011funda ve bu istisna metot i\u00e7inde yakalanmak istenmedi\u011finde, istisna metot imzas\u0131nda <code>throws<\/code> anahtar kelimesi ile bildirilir. Bu, istisnay\u0131 metodu \u00e7a\u011f\u0131ran \u00fcst seviyedeki koda b\u0131rak\u0131r. Servlet&#8217;lerde <code>doGet()<\/code> ve <code>doPost()<\/code> metotlar\u0131 varsay\u0131lan olarak <code>ServletException<\/code> ve <code>IOException<\/code> f\u0131rlatabilir olarak tan\u0131mlan\u0131r, bu da bu istisnalar\u0131n kapsay\u0131c\u0131 taraf\u0131ndan ele al\u0131nabilece\u011fi anlam\u0131na gelir.<\/p>\n<pre><code class=\"language-java\">protected void doGet(HttpServletRequest request, HttpServletResponse response)\n        throws ServletException, IOException {\n    \/\/ Burada f\u0131rlat\u0131lan ServletException veya IOException\n    \/\/ kapsay\u0131c\u0131 taraf\u0131ndan ele al\u0131nacakt\u0131r.\n    \/\/ \u00d6rne\u011fin, bir dosya okuma i\u015flemi IOException f\u0131rlatabilir.\n    \/\/ Veya \u00f6zel bir durum olu\u015ftu\u011funda ServletException f\u0131rlat\u0131labilir.\n    \/\/ throw new ServletException(\"\u00d6zel bir Servlet hatas\u0131 olu\u015ftu.\");\n}<\/code><\/pre>\n<h3>\u00d6zel Hata Sayfalar\u0131 (Error Pages)<\/h3>\n<p>Uygulama genelinde meydana gelen ve belirli bir <code>try-catch<\/code> blo\u011fu taraf\u0131ndan yakalanmayan istisnalar i\u00e7in, Servlet kapsay\u0131c\u0131s\u0131 varsay\u0131lan olarak bir hata sayfas\u0131 (genellikle bir y\u0131\u011f\u0131n izi i\u00e7eren beyaz bir sayfa) g\u00f6sterir. Bu, hem g\u00fcvenlik hem de kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan istenmeyen bir durumdur. \u00d6zel hata sayfalar\u0131, bu t\u00fcr durumlar i\u00e7in kullan\u0131c\u0131 dostu ve bilgilendirici sayfalar sunmak amac\u0131yla kullan\u0131l\u0131r.<\/p>\n<h3><code>web.xml<\/code> ile Hata Sayfas\u0131 Tan\u0131mlama<\/h3>\n<p>Servlet API, <code>web.xml<\/code> da\u011f\u0131t\u0131m tan\u0131mlay\u0131c\u0131s\u0131 arac\u0131l\u0131\u011f\u0131yla \u00f6zel hata sayfalar\u0131n\u0131 yap\u0131land\u0131rma imkan\u0131 sunar. Bu, belirli HTTP durum kodlar\u0131 (\u00f6rne\u011fin 404 Not Found, 500 Internal Server Error) veya belirli istisna t\u00fcrleri i\u00e7in \u00f6zel hata sayfalar\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-xml\"><!-- web.xml -->\n<web-app xmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\n                             http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\/web-app_4_0.xsd\"\n         version=\"4.0\">\n\n    <error-page>\n        <error-code>404<\/error-code>\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n    <error-page>\n        <error-code>500<\/error-code>\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n    <error-page>\n        <exception-type>java.lang.Exception<\/exception-type>\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n    <error-page>\n        <exception-type>javax.servlet.ServletException<\/exception-type>\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n    <error-page>\n        <exception-type>java.lang.ArithmeticException<\/exception-type>\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n\n<\/web-app><\/code><\/pre>\n<p>Yukar\u0131daki yap\u0131land\u0131rmada, herhangi bir <code>java.lang.Exception<\/code> (veya ondan t\u00fcreyen herhangi bir istisna) veya belirli bir HTTP durum kodu (404, 500) olu\u015ftu\u011funda, iste\u011fin <code>\/hataSayfasi.jsp<\/code> sayfas\u0131na y\u00f6nlendirilece\u011fi belirtilmi\u015ftir. Bu hata sayfas\u0131nda, iste\u011fe eklenen \u00f6zel nitelikler (attributes) arac\u0131l\u0131\u011f\u0131yla hata hakk\u0131nda detayl\u0131 bilgilere eri\u015filebilir:<br \/>\n*   <code>javax.servlet.error.status_code<\/code>: HTTP durum kodu (\u00f6rne\u011fin, 500).<br \/>\n*   <code>javax.servlet.error.exception_type<\/code>: \u0130stisna s\u0131n\u0131f\u0131n\u0131n tam ad\u0131 (\u00f6rne\u011fin, <code>java.lang.NullPointerException<\/code>).<br \/>\n*   <code>javax.servlet.error.message<\/code>: \u0130stisna mesaj\u0131.<br \/>\n*   <code>javax.servlet.error.exception<\/code>: \u0130stisna nesnesinin kendisi.<br \/>\n*   <code>javax.servlet.error.request_uri<\/code>: Hataya neden olan iste\u011fin URI&#8217;si.<br \/>\n*   <code>javax.servlet.error.servlet_name<\/code>: Hataya neden olan Servlet&#8217;in ad\u0131.<\/p>\n<h3>Programatik Hata Y\u00f6netimi (<code>RequestDispatcher<\/code>)<\/h3>\n<p>Baz\u0131 durumlarda, bir hata olu\u015ftu\u011funda programatik olarak bir hata sayfas\u0131na y\u00f6nlendirme yapmak isteyebilirsiniz. Bu, <code>RequestDispatcher<\/code> aray\u00fcz\u00fc kullan\u0131larak yap\u0131labilir. Bu yakla\u015f\u0131m, \u00f6zellikle belirli bir istisna t\u00fcr\u00fc i\u00e7in farkl\u0131 hata sayfalar\u0131 g\u00f6stermek veya hata sayfas\u0131na \u00f6zel veriler eklemek istedi\u011finizde faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-java\">import javax.servlet.RequestDispatcher;\n\n\/\/ ... doGet metodu i\u00e7inde\ntry {\n    \/\/ Hata potansiyeli olan kod\n} catch (SpecificException e) {\n    request.setAttribute(\"errorMessage\", \"\u00d6zel bir hata olu\u015ftu: \" + e.getMessage());\n    request.setAttribute(\"errorType\", e.getClass().getName());\n    RequestDispatcher dispatcher = request.getRequestDispatcher(\"\/ozelHataSayfasi.jsp\");\n    dispatcher.forward(request, response);\n}<\/code><\/pre>\n<h3><code>@WebServlet<\/code> ve \u0130stisnalar<\/h3>\n<p><code>@WebServlet<\/code> anonsu, Servlet&#8217;leri <code>web.xml<\/code> kullanmadan yap\u0131land\u0131rman\u0131n modern bir yoludur. Ancak, bu anons istisna y\u00f6netim mekanizmalar\u0131n\u0131 do\u011frudan etkilemez. <code>try-catch<\/code> bloklar\u0131, <code>throws<\/code> bildirimleri ve <code>web.xml<\/code> tabanl\u0131 hata sayfalar\u0131 <code>@WebServlet<\/code> ile tan\u0131mlanm\u0131\u015f Servlet&#8217;ler i\u00e7in de ge\u00e7erlidir. Anonslar sadece Servlet&#8217;in URL e\u015flemesini ve ba\u015flatma parametrelerini tan\u0131mlar.<\/p>\n<h2>\u00d6rnek Uygulama: \u0130stisna Y\u00f6netimini G\u00f6steren Bir Servlet<\/h2>\n<p>\u015eimdi, yukar\u0131da bahsedilen mekanizmalar\u0131 bir araya getiren basit bir \u00f6rnek uygulama geli\u015ftirelim. Bu uygulama, farkl\u0131 senaryolarda istisnalar\u0131 nas\u0131l y\u00f6netece\u011fimizi g\u00f6sterecektir.<\/p>\n<h3>Proje Kurulumu<\/h3>\n<p>*   <strong>Proje Tipi:<\/strong> Maven Web Projesi<br \/>\n*   <strong>IDE:<\/strong> Eclipse veya IntelliJ IDEA<br \/>\n*   <strong>Web Sunucusu:<\/strong> Apache Tomcat (9.x veya \u00fczeri)<\/p>\n<p><strong><code>pom.xml<\/code> (Gerekli Ba\u011f\u0131ml\u0131l\u0131klar):<\/strong><\/p>\n<pre><code class=\"language-xml\"><project xmlns=\"http:\/\/maven.apache.org\/POM\/4.0.0\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/maven-v4_0_0.xsd\">\n    <modelVersion>4.0.0<\/modelVersion>\n    <groupId>com.example<\/groupId>\n    <artifactId>servlet-error-handling<\/artifactId>\n    <packaging>war<\/packaging>\n    <version>1.0-SNAPSHOT<\/version>\n    <name>servlet-error-handling Maven Webapp<\/name>\n\n    <properties>\n        <maven.compiler.source>11<\/maven.compiler.target>\n        <maven.compiler.target>11<\/maven.compiler.target>\n        <project.build.sourceEncoding>UTF-8<\/project.build.sourceEncoding>\n    <\/properties>\n\n    <dependencies>\n        <dependency>\n            <groupId>javax.servlet<\/groupId>\n            <artifactId>javax.servlet-api<\/artifactId>\n            <version>4.0.1<\/version>\n            <scope>provided<\/scope>\n        <\/dependency>\n    <\/dependencies>\n\n    <build>\n        <finalName>servlet-error-handling<\/finalName>\n        <plugins>\n            <plugin>\n                <groupId>org.apache.maven.plugins<\/groupId>\n                <artifactId>maven-war-plugin<\/artifactId>\n                <version>3.3.2<\/version>\n            <\/plugin>\n        <\/plugins>\n    <\/build>\n<\/project><\/code><\/pre>\n<h3><code>web.xml<\/code> Yap\u0131land\u0131rmas\u0131<\/h3>\n<p><code>src\/main\/webapp\/WEB-INF\/web.xml<\/code> dosyas\u0131na a\u015fa\u011f\u0131daki yap\u0131land\u0131rmay\u0131 ekleyin. Bu, farkl\u0131 istisna t\u00fcrleri ve HTTP durum kodlar\u0131 i\u00e7in <code>\/hataSayfasi.jsp<\/code> adresine y\u00f6nlendirme yapacakt\u0131r.<\/p>\n<pre><code class=\"language-xml\"><!-- src\/main\/webapp\/WEB-INF\/web.xml -->\n<web-app xmlns=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\"\n         xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\n         xsi:schemaLocation=\"http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\n                             http:\/\/xmlns.jcp.org\/xml\/ns\/javaee\/web-app_4_0.xsd\"\n         version=\"4.0\">\n\n    <display-name>Servlet Error Handling Example<\/display-name>\n\n    <!-- Genel hata sayfas\u0131 tan\u0131mlamalar\u0131 -->\n    <error-page>\n        <exception-type>java.lang.Throwable<\/exception-type> <!-- T\u00fcm istisnalar\u0131 yakalar -->\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n    <error-page>\n        <error-code>500<\/error-code> <!-- \u0130\u00e7 Sunucu Hatas\u0131 -->\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n    <error-page>\n        <error-code>404<\/error-code> <!-- Sayfa Bulunamad\u0131 -->\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n    <error-page>\n        <exception-type>java.lang.NullPointerException<\/exception-type>\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n    <error-page>\n        <exception-type>java.lang.ArithmeticException<\/exception-type>\n        <location>\/hataSayfasi.jsp<\/location>\n    <\/error-page>\n\n<\/web-app><\/code><\/pre>\n<h3><code>HataYonetimiServlet.java<\/code><\/h3>\n<p><code>src\/main\/java\/com\/example\/HataYonetimiServlet.java<\/code> dosyas\u0131n\u0131 olu\u015fturun. Bu Servlet, URL parametrelerine g\u00f6re farkl\u0131 istisnalar f\u0131rlatacakt\u0131r.<\/p>\n<pre><code class=\"language-java\">\/\/ src\/main\/java\/com\/example\/HataYonetimiServlet.java\npackage com.example;\n\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n@WebServlet(\"\/hataTesti\")\npublic class HataYonetimiServlet extends HttpServlet {\n    private static final long serialVersionUID = 1L;\n\n    protected void doGet(HttpServletRequest request, HttpServletResponse response)\n            throws ServletException, IOException {\n        response.setContentType(\"text\/html;charset=UTF-8\");\n        PrintWriter out = response.getWriter();\n\n        String hataTipi = request.getParameter(\"tip\");\n        String sayiStr = request.getParameter(\"sayi\");\n\n        out.println(\"<html><head><title>Hata Y\u00f6netimi Testi<\/title><\/head><body>\");\n        out.println(\"\");\n\n        try {\n            if (hataTipi == null) {\n                out.println(\"<p>L\u00fctfen bir hata tipi belirtin (\u00f6rn: ?tip=null, ?tip=aritmetik, ?tip=servlet, ?tip=io, ?tip=sayi&sayi=0).<\/p>\");\n            } else if (hataTipi.equals(\"null\")) {\n                String s = null;\n                s.length(); \/\/ NullPointerException f\u0131rlat\u0131r\n            } else if (hataTipi.equals(\"aritmetik\")) {\n                int bolen = 0;\n                int sonuc = 100 \/ bolen; \/\/ ArithmeticException f\u0131rlat\u0131r\n            } else if (hataTipi.equals(\"sayi\")) {\n                int sayi = Integer.parseInt(sayiStr); \/\/ NumberFormatException f\u0131rlatabilir\n                out.println(\"<p>Girilen say\u0131: \" + sayi + \"<\/p>\");\n            } else if (hataTipi.equals(\"servlet\")) {\n                throw new ServletException(\"\u00d6zel bir ServletException olu\u015ftu!\");\n            } else if (hataTipi.equals(\"io\")) {\n                throw new IOException(\"Dosya okuma\/yazma hatas\u0131 sim\u00fclasyonu.\");\n            } else if (hataTipi.equals(\"genel\")) {\n                throw new Exception(\"Genel bir hata olu\u015ftu.\");\n            } else {\n                out.println(\"<p>Ge\u00e7ersiz hata tipi belirtildi.<\/p>\");\n            }\n        } catch (NumberFormatException e) {\n            \/\/ Bu istisnay\u0131 burada yakal\u0131yoruz, b\u00f6ylece \u00f6zel bir mesaj g\u00f6sterebiliriz.\n            \/\/ Di\u011fer istisnalar web.xml taraf\u0131ndan yakalanacakt\u0131r.\n            out.println(\"<p style='color:orange;'>Uyar\u0131: Ge\u00e7ersiz say\u0131 format\u0131! L\u00fctfen ge\u00e7erli bir tamsay\u0131 girin.<\/p>\");\n            out.println(\"<p>Detay: \" + e.getMessage() + \"<\/p>\");\n            \/\/ \u0130ste\u011fi yine de hata sayfas\u0131na y\u00f6nlendirebiliriz, ancak burada basit bir \u00e7\u0131kt\u0131 verdik.\n        } catch (IOException e) {\n            \/\/ IOException'\u0131 burada yakalay\u0131p ServletException olarak sarmalay\u0131p f\u0131rlat\u0131yoruz.\n            \/\/ B\u00f6ylece web.xml'deki <exception-type>java.lang.Throwable<\/exception-type> veya\n            \/\/ <exception-type>javax.servlet.ServletException<\/exception-type> taraf\u0131ndan yakalanabilir.\n            throw new ServletException(\"G\/\u00c7 hatas\u0131 olu\u015ftu.\", e);\n        } catch (Exception e) {\n            \/\/ Di\u011fer t\u00fcm beklenmeyen istisnalar\u0131 ServletException olarak sarmalay\u0131p f\u0131rlat\u0131yoruz.\n            \/\/ Bu, web.xml'deki yap\u0131land\u0131rman\u0131n devreye girmesini sa\u011flar.\n            throw new ServletException(\"Beklenmeyen bir hata olu\u015ftu.\", e);\n        } finally {\n            out.println(\"<p>Servlet i\u015fleme denemesi tamamland\u0131.<\/p>\");\n            out.println(\"<\/body><\/html>\");\n            out.close();\n        }\n    }\n}<\/code><\/pre>\n<h3><code>hataSayfasi.jsp<\/code><\/h3>\n<p><code>src\/main\/webapp\/hataSayfasi.jsp<\/code> dosyas\u0131n\u0131 olu\u015fturun. Bu sayfa, <code>web.xml<\/code>&#8216;de tan\u0131mlanan t\u00fcm hata durumlar\u0131 i\u00e7in g\u00f6r\u00fcnt\u00fclenecektir.<\/p>\n<pre><code class=\"language-jsp\"><%-- src\/main\/webapp\/hataSayfasi.jsp --%>\n<%@ page isErrorPage=\"true\" %>\n<%@ page language=\"java\" contentType=\"text\/html; charset=UTF-8\" pageEncoding=\"UTF-8\"%>\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"UTF-8\">\n    <title>Bir Hata Olu\u015ftu!<\/title>\n    <style>\n        body { font-family: Arial, sans-serif; background-color: #f8f8f8; color: #333; margin: 20px; }\n        .container { max-width: 800px; margin: auto; background: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); }\n        h1 { color: #d9534f; }\n        h2 { color: #f0ad4e; border-bottom: 1px solid #eee; padding-bottom: 10px; margin-top: 20px; }\n        p { line-height: 1.6; }\n        .error-details { background-color: #fdf7f7; border: 1px solid #fbe5e5; padding: 15px; border-radius: 5px; margin-top: 20px; }\n        .error-details strong { color: #c9302c; }\n        pre { background-color: #eee; padding: 10px; border-radius: 5px; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word; }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"container\">\n        \n        <p>\u0130ste\u011finiz i\u015flenirken beklenmeyen bir hata meydana geldi. L\u00fctfen daha sonra tekrar deneyin veya sistem y\u00f6neticinizle ileti\u015fime ge\u00e7in.<\/p>\n\n        <h2>Hata Detaylar\u0131<\/h2>\n        <div class=\"error-details\">\n            <p><strong>HTTP Durum Kodu:<\/strong> <%= request.getAttribute(\"javax.servlet.error.status_code\") %><\/p>\n            <p><strong>Hata Mesaj\u0131:<\/strong> <%= request.getAttribute(\"javax.servlet.error.message\") %><\/p>\n            <p><strong>\u0130stek URI:<\/strong> <%= request.getAttribute(\"javax.servlet.error.request_uri\") %><\/p>\n            <p><strong>Servlet Ad\u0131:<\/strong> <%= request.getAttribute(\"javax.servlet.error.servlet_name\") %><\/p>\n            <p><strong>\u0130stisna Tipi:<\/strong> <%= request.getAttribute(\"javax.servlet.error.exception_type\") %><\/p>\n            <p><strong>\u0130stisna Nesnesi:<\/strong> <%= request.getAttribute(\"javax.servlet.error.exception\") %><\/p>\n            \n            <%\n                Throwable exception = (Throwable) request.getAttribute(\"javax.servlet.error.exception\");\n                if (exception != null) {\n            %>\n                <p><strong>Y\u0131\u011f\u0131n \u0130zlemesi:<\/strong><\/p>\n                <pre>\n                    <%\n                        java.io.StringWriter sw = new java.io.StringWriter();\n                        java.io.PrintWriter pw = new java.io.PrintWriter(sw);\n                        exception.printStackTrace(pw);\n                        out.print(sw.toString());\n                    %>\n                <\/pre>\n<p>            <%\n                }\n            %>\n        <\/div>\n<p><a href=\"\/\">Ana Sayfaya D\u00f6n<\/a><\/p>\n<\/p><\/div>\n<p><\/body><br \/>\n<\/html><\/code><br \/>\n<strong>Not:<\/strong> \u00dcretim ortam\u0131nda, <code>Y\u0131\u011f\u0131n \u0130zlemesi<\/code> gibi detayl\u0131 bilgilerin son kullan\u0131c\u0131ya g\u00f6sterilmemesi \u00f6nemlidir. Bu \u00f6rnek, e\u011fitim ama\u00e7l\u0131d\u0131r.<\/p>\n<h3>Uygulaman\u0131n \u00c7al\u0131\u015ft\u0131r\u0131lmas\u0131 ve Test Edilmesi<\/h3>\n<p>1.  Projeyi Maven ile derleyin (<code>mvn clean install<\/code>).<br \/>\n2.  Olu\u015fan <code>.war<\/code> dosyas\u0131n\u0131 Tomcat&#8217;in <code>webapps<\/code> dizinine kopyalay\u0131n veya IDE&#8217;niz \u00fczerinden Tomcat&#8217;e deploy edin.<br \/>\n3.  Web taray\u0131c\u0131n\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki URL&#8217;leri deneyin:<br \/>\n    *   <strong>Ba\u015far\u0131l\u0131 \u0130\u015flem (Hata Yok):<\/strong> <code>http:\/\/localhost:8080\/servlet-error-handling\/hataTesti<\/code> (genel mesaj g\u00f6sterir)<br \/>\n    *   <strong><code>NullPointerException<\/code>:<\/strong> <code>http:\/\/localhost:8080\/servlet-error-handling\/hataTesti?tip=null<\/code><br \/>\n        *   <code>web.xml<\/code>&#8216;deki <code>java.lang.NullPointerException<\/code> veya <code>java.lang.Throwable<\/code> kural\u0131 devreye girecek ve <code>hataSayfasi.jsp<\/code> g\u00f6sterilecektir.<br \/>\n    *   <strong><code>ArithmeticException<\/code> (S\u0131f\u0131ra B\u00f6lme):<\/strong> <code>http:\/\/localhost:8080\/servlet-error-handling\/hataTesti?tip=aritmetik<\/code><br \/>\n        *   <code>web.xml<\/code>&#8216;deki <code>java.lang.ArithmeticException<\/code> veya <code>java.lang.Throwable<\/code> kural\u0131 devreye girecek ve <code>hataSayfasi.jsp<\/code> g\u00f6sterilecektir.<br \/>\n    *   <strong><code>NumberFormatException<\/code> (Servlet \u0130\u00e7inde Yakalanan):<\/strong> <code>http:\/\/localhost:8080\/servlet-error-handling\/hataTesti?tip=sayi&sayi=abc<\/code><br \/>\n        *   Bu istisna Servlet i\u00e7indeki <code>try-catch<\/code> blo\u011fu taraf\u0131ndan yakalanacak ve \u00f6zel bir uyar\u0131 mesaj\u0131 do\u011frudan Servlet \u00e7\u0131kt\u0131s\u0131nda g\u00f6sterilecektir, <code>hataSayfasi.jsp<\/code>&#8216;ye y\u00f6nlendirme yap\u0131lmayacakt\u0131r.<br \/>\n    *   <strong><code>ServletException<\/code>:<\/strong> <code>http:\/\/localhost:8080\/servlet-error-handling\/hataTesti?tip=servlet<\/code><br \/>\n        *   <code>web.xml<\/code>&#8216;deki <code>java.lang.Throwable<\/code> kural\u0131 devreye girecek ve <code>hataSayfasi.jsp<\/code> g\u00f6sterilecektir.<br \/>\n    *   <strong><code>IOException<\/code> (Servlet \u0130\u00e7inde Sarmalanan):<\/strong> <code>http:\/\/localhost:8080\/servlet-error-handling\/hataTesti?tip=io<\/code><br \/>\n        *   Servlet i\u00e7inde yakalan\u0131p <code>ServletException<\/code> olarak sarmaland\u0131\u011f\u0131 i\u00e7in yine <code>hataSayfasi.jsp<\/code> g\u00f6sterilecektir.<br \/>\n    *   <strong>Olmayan Bir Sayfa (404 Hatas\u0131):<\/strong> <code>http:\/\/localhost:8080\/servlet-error-handling\/olmayanbiradres<\/code><br \/>\n        *   <code>web.xml<\/code>&#8216;deki <code>404<\/code> hata kodu kural\u0131 devreye girecek ve <code>hataSayfasi.jsp<\/code> g\u00f6sterilecektir.<\/p>\n<h2>Geli\u015fmi\u015f Hata Y\u00f6netimi Konular\u0131<\/h2>\n<p>Basit <code>try-catch<\/code> bloklar\u0131 ve <code>web.xml<\/code> yap\u0131land\u0131rmas\u0131n\u0131n \u00f6tesinde, daha karma\u015f\u0131k ve b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in geli\u015fmi\u015f hata y\u00f6netimi stratejileri uygulanabilir.<\/p>\n<h3>Loglama (Logging)<\/h3>\n<p>Hata y\u00f6netimi, sadece kullan\u0131c\u0131ya g\u00fczel bir sayfa g\u00f6stermekle kalmaz, ayn\u0131 zamanda geli\u015ftiricilerin sorunlar\u0131 tespit etmesini ve gidermesini sa\u011flamak i\u00e7in detayl\u0131 bilgileri kaydetmeyi de i\u00e7erir. Loglama \u00e7er\u00e7eveleri (\u00f6rne\u011fin Log4j, SLF4j, Java Util Logging &#8211; JUL) bu ama\u00e7 i\u00e7in vazge\u00e7ilmezdir. Bir istisna yakaland\u0131\u011f\u0131nda, tam y\u0131\u011f\u0131n izi ve ilgili ba\u011flam bilgileri (kullan\u0131c\u0131 ID&#8217;si, istek parametreleri vb.) loglanmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-java\">import java.util.logging.Level;\nimport java.util.logging.Logger;\n\n\/\/ ...\nprivate static final Logger LOGGER = Logger.getLogger(HataYonetimiServlet.class.getName());\n\/\/ ...\n\ntry {\n    \/\/ Hata potansiyeli olan kod\n} catch (Exception e) {\n    LOGGER.log(Level.SEVERE, \"HataYonetimiServlet i\u00e7inde beklenmeyen bir hata olu\u015ftu.\", e);\n    throw new ServletException(\"Uygulama hatas\u0131.\", e);\n}<\/code><\/pre>\n<h3>\u00d6zel \u0130stisna S\u0131n\u0131flar\u0131<\/h3>\n<p>Uygulaman\u0131za \u00f6zg\u00fc i\u015f mant\u0131\u011f\u0131 hatalar\u0131n\u0131 temsil etmek i\u00e7in kendi \u00f6zel istisna s\u0131n\u0131flar\u0131n\u0131z\u0131 olu\u015fturmak iyi bir pratiktir. Bu, kodunuzu daha okunabilir hale getirir ve hata t\u00fcrlerini daha spesifik olarak ele alman\u0131z\u0131 sa\u011flar. \u00d6rne\u011fin, bir kullan\u0131c\u0131 kay\u0131t sisteminde <code>KullaniciMevcutException<\/code> veya <code>GecersizSifreException<\/code> gibi istisnalar tan\u0131mlanabilir.<\/p>\n<pre><code class=\"language-java\">public class UygulamaIsHatasi extends Exception {\n    public UygulamaIsHatasi(String message) {\n        super(message);\n    }\n    public UygulamaIsHatasi(String message, Throwable cause) {\n        super(message, cause);\n    }\n}<\/code><\/pre>\n<h3>Filtreler (Filters) ile Global Hata Y\u00f6netimi<\/h3>\n<p>Servlet filtreleri, bir iste\u011fin Servlet&#8217;e ula\u015fmadan \u00f6nce veya Servlet&#8217;ten ayr\u0131ld\u0131ktan sonra i\u015flenmesini sa\u011flayan g\u00fc\u00e7l\u00fc bile\u015fenlerdir. Bir filtre, t\u00fcm isteklere (ve dolay\u0131s\u0131yla t\u00fcm Servlet&#8217;lere) uygulanan global bir hata yakalay\u0131c\u0131 olarak kullan\u0131labilir. Bu, <code>web.xml<\/code>&#8216;deki genel <code><error-page><\/code> yap\u0131land\u0131rmas\u0131na benzer bir i\u015flevsellik sa\u011flar, ancak daha fazla programatik kontrol sunar.<\/p>\n<pre><code class=\"language-java\">import java.io.IOException;\nimport javax.servlet.Filter;\nimport javax.servlet.FilterChain;\nimport javax.servlet.FilterConfig;\nimport javax.servlet.ServletException;\nimport javax.servlet.ServletRequest;\nimport javax.servlet.ServletResponse;\nimport javax.servlet.annotation.WebFilter;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\n\n@WebFilter(\"\/*\") \/\/ T\u00fcm URL'ler i\u00e7in\npublic class GlobalErrorHandlingFilter implements Filter {\n\n    @Override\n    public void init(FilterConfig filterConfig) throws ServletException {\n        \/\/ Ba\u015flatma i\u015flemleri\n    }\n\n    @Override\n    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)\n            throws IOException, ServletException {\n        try {\n            chain.doFilter(request, response);\n        } catch (Throwable ex) {\n            \/\/ Loglama yap\n            Logger.getLogger(getClass().getName()).log(Level.SEVERE, \"Global filtrede yakalanan hata!\", ex);\n\n            HttpServletRequest httpRequest = (HttpServletRequest) request;\n            HttpServletResponse httpResponse = (HttpServletResponse) response;\n\n            \/\/ Hata detaylar\u0131n\u0131 request niteli\u011fi olarak ekle\n            httpRequest.setAttribute(\"javax.servlet.error.exception\", ex);\n            httpRequest.setAttribute(\"javax.servlet.error.message\", ex.getMessage());\n            httpRequest.setAttribute(\"javax.servlet.error.status_code\", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\n            httpRequest.setAttribute(\"javax.servlet.error.request_uri\", httpRequest.getRequestURI());\n            \n            \/\/ Hata sayfas\u0131na y\u00f6nlendir\n            httpRequest.getRequestDispatcher(\"\/hataSayfasi.jsp\").forward(httpRequest, httpResponse);\n        }\n    }\n\n    @Override\n    public void destroy() {\n        \/\/ Temizleme i\u015flemleri\n    }\n}<\/code><\/pre>\n<p>Bu filtre, <code>chain.doFilter()<\/code> \u00e7a\u011fr\u0131s\u0131 s\u0131ras\u0131nda f\u0131rlat\u0131lan herhangi bir <code>Throwable<\/code> (istisna veya hata) yakalar, loglar ve iste\u011fi \u00f6zel hata sayfas\u0131na y\u00f6nlendirir.<\/p>\n<h3>Asenkron Servlet&#8217;lerde Hata Y\u00f6netimi<\/h3>\n<p>Servlet 3.0 ile tan\u0131t\u0131lan asenkron i\u015fleme, uzun s\u00fcren i\u015flemleri engellemeden ger\u00e7ekle\u015ftirmeye olanak tan\u0131r. Asenkron Servlet&#8217;lerde hata y\u00f6netimi, standart senkron Servlet&#8217;lerden biraz farkl\u0131d\u0131r. <code>AsyncContext<\/code> nesnesi \u00fczerinden hatalar\u0131 y\u00f6netmek i\u00e7in <code>AsyncListener<\/code> aray\u00fcz\u00fc kullan\u0131labilir.<br \/>\n<code>AsyncListener<\/code> aray\u00fcz\u00fc <code>onComplete<\/code>, <code>onError<\/code>, <code>onStartAsync<\/code> ve <code>onTimeout<\/code> metotlar\u0131n\u0131 i\u00e7erir. \u00d6zellikle <code>onError<\/code> metodu, asenkron i\u015flem s\u0131ras\u0131nda bir hata olu\u015ftu\u011funda devreye girer.<\/p>\n<pre><code class=\"language-java\">import javax.servlet.AsyncContext;\nimport javax.servlet.AsyncEvent;\nimport javax.servlet.AsyncListener;\nimport javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.util.logging.Level;\nimport java.util.logging.Logger;\n\n@WebServlet(urlPatterns = \"\/asyncError\", asyncSupported = true)\npublic class AsyncErrorServlet extends HttpServlet {\n    private static final Logger LOGGER = Logger.getLogger(AsyncErrorServlet.class.getName());\n\n    protected void doGet(HttpServletRequest request, HttpServletResponse response)\n            throws ServletException, IOException {\n        response.setContentType(\"text\/html;charset=UTF-8\");\n        PrintWriter out = response.getWriter();\n        out.println(\"<html><body>\");\n\n        AsyncContext asyncContext = request.startAsync();\n        asyncContext.setTimeout(5000); \/\/ 5 saniye zaman a\u015f\u0131m\u0131\n\n        asyncContext.addListener(new AsyncListener() {\n            @Override\n            public void onComplete(AsyncEvent event) throws IOException {\n                LOGGER.info(\"Asenkron i\u015flem tamamland\u0131.\");\n                \/\/ asyncContext.getResponse().getWriter().println(\"<p>Asenkron i\u015flem ba\u015far\u0131yla tamamland\u0131.<\/p>\");\n                \/\/ event.getAsyncContext().complete(); \/\/ Zaten complete edildi\n            }\n\n            @Override\n            public void onError(AsyncEvent event) throws IOException {\n                Throwable throwable = event.getThrowable();\n                LOGGER.log(Level.SEVERE, \"Asenkron i\u015flemde hata olu\u015ftu!\", throwable);\n                HttpServletResponse resp = (HttpServletResponse) event.getAsyncContext().getResponse();\n                resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\n                resp.getWriter().println(\"<p style='color:red;'>Asenkron i\u015flem s\u0131ras\u0131nda bir hata olu\u015ftu: \" + throwable.getMessage() + \"<\/p>\");\n                event.getAsyncContext().complete(); \/\/ Hata sonras\u0131 i\u015flemi tamamla\n            }\n\n            @Override\n            public void onStartAsync(AsyncEvent event) throws IOException {\n                LOGGER.info(\"Asenkron i\u015flem ba\u015flad\u0131.\");\n            }\n\n            @Override\n            public void onTimeout(AsyncEvent event) throws IOException {\n                LOGGER.warning(\"Asenkron i\u015flem zaman a\u015f\u0131m\u0131na u\u011frad\u0131.\");\n                HttpServletResponse resp = (HttpServletResponse) event.getAsyncContext().getResponse();\n                resp.setStatus(HttpServletResponse.SC_REQUEST_TIMEOUT);\n                resp.getWriter().println(\"<p style='color:orange;'>Asenkron i\u015flem zaman a\u015f\u0131m\u0131na u\u011frad\u0131!<\/p>\");\n                event.getAsyncContext().complete(); \/\/ Zaman a\u015f\u0131m\u0131 sonras\u0131 i\u015flemi tamamla\n            }\n        });\n\n        \/\/ Asenkron i\u015flemi ba\u015fka bir thread'de ba\u015flat\n        asyncContext.start(() -> {\n            try {\n                Thread.sleep(2000); \/\/ 2 saniye beklet\n                String triggerError = request.getParameter(\"triggerError\");\n                if (\"true\".equals(triggerError)) {\n                    throw new RuntimeException(\"Asenkron i\u015f par\u00e7ac\u0131\u011f\u0131nda kas\u0131tl\u0131 hata!\");\n                }\n                asyncContext.getResponse().getWriter().println(\"<p>Asenkron i\u015flem ba\u015far\u0131yla tamamland\u0131.<\/p>\");\n            } catch (Exception e) {\n                \/\/ Burada yakalanan istisnalar onError metodunu tetikleyecektir.\n                \/\/ E\u011fer burada yakalanmazsa ve f\u0131rlat\u0131l\u0131rsa da onError tetiklenir.\n                \/\/ \u00d6rne\u011fin: throw new RuntimeException(e);\n                LOGGER.log(Level.SEVERE, \"Asenkron i\u015f par\u00e7ac\u0131\u011f\u0131 hatas\u0131\", e);\n                \/\/ Hata olu\u015ftu\u011funda onError tetiklenmesi i\u00e7in \u00f6zel olarak bir \u015fey yapmaya gerek yok,\n                \/\/ f\u0131rlat\u0131lan istisna otomatik olarak AsyncListener.onError'\u0131 \u00e7a\u011f\u0131r\u0131r.\n            } finally {\n                \/\/ E\u011fer hata olu\u015fmazsa veya onError'da complete edilmezse, burada complete edebiliriz.\n                \/\/ Ancak onError veya onTimeout i\u00e7inde complete edildi\u011fi i\u00e7in burada gerekli de\u011fil.\n                \/\/ asyncContext.complete();\n            }\n        });\n\n        out.println(\"<p>Asenkron i\u015flem ba\u015flat\u0131ld\u0131...<\/p>\");\n        out.println(\"<\/body><\/html>\");\n        \/\/ out.close(); \/\/ Asenkron i\u015flemlerde response'u burada kapatmay\u0131n\n    }\n}<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>\/asyncError?triggerError=true<\/code> \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda <code>onError<\/code> metodu devreye girerek kullan\u0131c\u0131ya hata mesaj\u0131 g\u00f6sterecektir.<\/p>\n<h2>En \u0130yi Uygulamalar ve \u00d6neriler<\/h2>\n<p>Sa\u011flam bir hata y\u00f6netim stratejisi olu\u015ftururken g\u00f6z \u00f6n\u00fcnde bulundurulmas\u0131 gereken baz\u0131 en iyi uygulamalar:<\/p>\n<h3>Hata Mesajlar\u0131n\u0131 Kullan\u0131c\u0131ya \u00d6zel Hale Getirme<\/h3>\n<p>Son kullan\u0131c\u0131n\u0131n g\u00f6rece\u011fi hata mesajlar\u0131 sade, anla\u015f\u0131l\u0131r ve eyleme d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir olmal\u0131d\u0131r. Teknik detaylardan ka\u00e7\u0131n\u0131lmal\u0131, kullan\u0131c\u0131ya ne oldu\u011funu ve ne yapmas\u0131 gerekti\u011fini bildiren nazik bir dil kullan\u0131lmal\u0131d\u0131r. Geli\u015ftiriciler i\u00e7in ise loglarda detayl\u0131 teknik bilgiler bulunmal\u0131d\u0131r.<\/p>\n<h3>G\u00fcvenlik Konular\u0131<\/h3>\n<p>Hata mesajlar\u0131 asla hassas bilgileri (veritaban\u0131 ba\u011flant\u0131 dizeleri, API anahtarlar\u0131, sunucu yollar\u0131, tam y\u0131\u011f\u0131n izleri) if\u015fa etmemelidir. Bu t\u00fcr bilgiler potansiyel g\u00fcvenlik a\u00e7\u0131klar\u0131na yol a\u00e7abilir. \u00dcretim ortam\u0131nda y\u0131\u011f\u0131n izlerinin g\u00f6sterilmesi kesinlikle \u00f6nerilmez.<\/p>\n<h3>Performans Etkileri<\/h3>\n<p>\u0130stisna f\u0131rlatma ve yakalama i\u015flemleri, \u00f6zellikle y\u00fcksek hacimli uygulamalarda performans \u00fczerinde bir miktar y\u00fck olu\u015fturabilir. \u0130stisnalar, uygulaman\u0131n normal ak\u0131\u015f\u0131n\u0131n bir par\u00e7as\u0131 olmamal\u0131, yaln\u0131zca ola\u011fan\u00fcst\u00fc durumlar i\u00e7in kullan\u0131lmal\u0131d\u0131r. Mant\u0131ksal kontrollerle \u00f6nlenebilecek durumlar i\u00e7in istisna f\u0131rlatmak yerine, if-else bloklar\u0131 kullanmak daha performansl\u0131 olabilir.<\/p>\n<h3>Tutarl\u0131l\u0131k<\/h3>\n<p>Uygulaman\u0131z\u0131n genelinde tutarl\u0131 bir hata y\u00f6netim stratejisi benimseyin. Hata sayfalar\u0131n\u0131n g\u00f6r\u00fcn\u00fcm\u00fc, loglama format\u0131 ve istisna i\u015fleme yakla\u015f\u0131mlar\u0131 tutarl\u0131 olmal\u0131d\u0131r. Bu, hem geli\u015ftirme hem de bak\u0131m s\u00fcre\u00e7lerini kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Hata Sayfas\u0131 \u0130\u00e7eri\u011fi<\/h3>\n<p>Hata sayfalar\u0131 sadece hata mesaj\u0131n\u0131 g\u00f6stermemelidir. Kullan\u0131c\u0131ya ana sayfaya d\u00f6n\u00fc\u015f ba\u011flant\u0131s\u0131, yard\u0131m b\u00f6l\u00fcm\u00fcne y\u00f6nlendirme veya ileti\u015fim bilgileri gibi faydal\u0131 se\u00e7enekler sunmal\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Servlet tabanl\u0131 web uygulamalar\u0131nda istisna ve hata y\u00f6netimi, uygulaman\u0131n kararl\u0131l\u0131\u011f\u0131, g\u00fcvenilirli\u011fi, g\u00fcvenli\u011fi ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan hayati \u00f6neme sahiptir. Bu makalede, <code>try-catch-finally<\/code> bloklar\u0131ndan <code>web.xml<\/code> tabanl\u0131 \u00f6zel hata sayfalar\u0131na, filtrelerden asenkron Servlet&#8217;lere kadar \u00e7e\u015fitli istisna y\u00f6netim mekanizmalar\u0131n\u0131 ve bunlar\u0131n pratik bir \u00f6rnek \u00fczerinden nas\u0131l uygulanaca\u011f\u0131n\u0131 ele ald\u0131k.<\/p>\n<p>Unutulmamal\u0131d\u0131r ki, iyi bir hata y\u00f6netimi stratejisi, sadece kodun \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakla kalmaz, ayn\u0131 zamanda uygulaman\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca s\u00fcrd\u00fcr\u00fclebilirli\u011fini ve geli\u015ftirici verimlili\u011fini de art\u0131r\u0131r. Geli\u015ftiricilerin, potansiyel hata senaryolar\u0131n\u0131 \u00f6ng\u00f6rmesi, uygun y\u00f6netim mekanizmalar\u0131n\u0131 se\u00e7mesi ve kullan\u0131c\u0131ya y\u00f6nelik bilgilendirici, geli\u015ftiriciye y\u00f6nelik detayl\u0131 hata geri bildirimleri sa\u011flamas\u0131, ba\u015far\u0131l\u0131 bir web uygulamas\u0131 geli\u015ftirmenin anahtar\u0131d\u0131r. Bu rehberin, Servlet uygulamalar\u0131n\u0131zda daha sa\u011flam ve hataya dayan\u0131kl\u0131 \u00e7\u00f6z\u00fcmler geli\u015ftirmenize yard\u0131mc\u0131 olmas\u0131n\u0131 umuyoruz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama\nGiri\u015f\nWeb uygulamalar\u0131 g\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131n\u0131n temel ta","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-36602","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama\" \/>\n<meta property=\"og:description\" content=\"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama  Giri\u015f Web uygulamalar\u0131 g\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131n\u0131n temel ta\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-20T10:41:00+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama\",\"datePublished\":\"2025-12-20T10:41:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/\"},\"wordCount\":2371,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/\",\"name\":\"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-20T10:41:00+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama - Kodlar\u0131n Gizemli D\u00fcnyas\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:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/","og_locale":"tr_TR","og_type":"article","og_title":"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama","og_description":"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama  Giri\u015f Web uygulamalar\u0131 g\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131n\u0131n temel ta","og_url":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-20T10:41:00+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama","datePublished":"2025-12-20T10:41:00+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/"},"wordCount":2371,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/","url":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/","name":"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-20T10:41:00+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/servlet-istisnalari-ve-hata-yonetimi-kapsamli-bir-rehber-ve-ornek-uygulama\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Servlet \u0130stisnalar\u0131 ve Hata Y\u00f6netimi: Kapsaml\u0131 Bir Rehber ve \u00d6rnek Uygulama"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36602","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36602"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36602\/revisions"}],"predecessor-version":[{"id":36603,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36602\/revisions\/36603"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36602"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36602"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36602"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}