{"id":333,"date":"2026-07-08T16:49:36","date_gmt":"2026-07-08T08:49:36","guid":{"rendered":"https:\/\/numsimlab.com\/?p=333"},"modified":"2026-07-08T16:49:36","modified_gmt":"2026-07-08T08:49:36","slug":"python-exceptions%e8%af%a6%e7%bb%86%e8%af%b4%e6%98%8e","status":"publish","type":"post","link":"https:\/\/numsimlab.com\/?p=333","title":{"rendered":"python-exceptions\u8be6\u7ec6\u8bf4\u660e"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>python-exceptions\u8be6\u7ec6\u8bf4\u660e<\/title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nhtml{scroll-behavior:smooth}\n:root{\n  --bg:#f8f9fa;--bg2:#fff;--ink:#1a1a2e;--muted:#6c7086;--rule:#e2e4eb;\n  --accent:#2563eb;--accent2:#16a34a;--accent3:#dc2626;--accent4:#d97706;--accent5:#7c3aed;\n  --card-bg:#fff;--code-bg:#f1f3f5;\n  --tag-g:#dcfce7;--tag-g-t:#166534;--tag-b:#dbeafe;--tag-b-t:#1e40af;\n  --tag-r:#fee2e2;--tag-r-t:#991b1b;--tag-y:#fef9c3;--tag-y-t:#713f12;--tag-p:#f3e8ff;--tag-p-t:#581c87;\n  --shadow:0 1px 3px rgba(0,0,.08);--radius:8px;--max-w:940px\n}\n[data-theme=\"dark\"]{\n  --bg:#0b0b1a;--bg2:#16162a;--ink:#e2e4f0;--muted:#7f8396;--rule:#26263e;\n  --accent:#60a5fa;--accent2:#4ade80;--accent3:#f87171;--accent4:#fbbf24;--accent5:#a78bfa;\n  --card-bg:#16162a;--code-bg:#1e36;\n  --tag-g:#14532d;--tag-g-t:#bbf7d0;--tag-b:#1e3a5f;--tag-b-t:#bfdbfe;\n  --tag-r:#7f1d1d;--tag-r-t:#fecaca;--tag-y:#713f12;--tag-y-t:#fef08a;\n  --tag-p:#3b1f6e;--tag-p-t:#e9d5ff;\n  --shadow:0 1px 3px rgba(0,0,.3)\n}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",\"Noto Sans SC\",\"PingFang SC\",\"Microsoft YaHei\",sans-serif;background:var(--bg);color:var(--ink);line-height:1.7;font-size:15px;transition:background .3s,color .3s}\nheader{position:fixed;top:0;left:0;right:0;z-index:100;background:var(--bg2);border-bottom:1px solid var(--rule);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);transition:background .3s}\n.header-inner{max-width:var(--max-w);margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:56px}\n.logo{font-weight:700;font-size:.95rem;color:var(--accent);display:flex;align-items:center;gap:.4rem}\n.controls{display:flex;align-items:center;gap:.5rem}\n.lang-switch{display:flex;border:1px solid var(--rule);border-radius:6px;overflow:hidden}\n.lang-switch button{background:0 0;border:none;color:var(--muted);padding:.3rem .7rem;font-size:.8rem;cursor:pointer;transition:all .2s;font-family:inherit}\n.lang-switch button.active{background:var(--accent);color:#fff}\n.lang-switch button:not(.active):hover{color:var(--ink);background:var(--rule)}\n.theme-toggle{background:0 0;border:1px solid var(--rule);border-radius:6px;color:var(--muted);width:34px;height:34px;font-size:1rem;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s}\n.theme-toggle:hover{color:var(--ink);background:var(--rule)}\nmain{max-width:var(--max-w);margin:0 auto;padding:80px 1.5rem 3rem}\n.lang-section{display:none}.lang-section.active{display:block}\nh1{font-size:1.9rem;font-weight:800;line-height:1.3;margin-bottom:.5rem;letter-spacing:-.02em}\nh1 .sub{display:block;font-size:.85rem;font-weight:400;color:var(--muted);margin-top:.25rem;letter-spacing:0}\nh2{font-size:1.35rem;font-weight:700;margin:2.5rem 0 1rem;padding-bottom:.5rem;border-bottom:2px solid var(--accent);letter-spacing:-.01em}\nh3{font-size:1.05rem;font-weight:600;margin:1.5rem 0 .6rem;color:var(--accent)}\nh4{font-size:.95rem;font-weight:600;margin:1rem 0 .4rem;color:var(--ink)}\np{margin-bottom:.8rem}\na{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}\n.hero{text-align:center;padding:2rem 0 1rem}\n.hero p{font-size:1rem;color:var(--muted);max-width:700px;margin:0 auto}\n.tag{display:inline-block;padding:.12rem .5rem;border-radius:4px;font-size:.72rem;font-weight:600;margin-right:.25rem;white-space:nowrap}\n.tag-g{background:var(--tag-g);color:var(--tag-g-t)}.tag-b{background:var(--tag-b);color:var(--tag-b-t)}\n.tag-r{background:var(--tag-r);color:var(--tag-r-t)}.tag-y{background:var(--tag-y);color:var(--tag-y-t)}.tag-p{background:var(--tag-p);color:var(--tag-p-t)}\n.card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin-bottom:1rem;box-shadow:var(--shadow)}\n.info-box{background:var(--bg);border-left:4px solid var(--accent);padding:.9rem 1.1rem;margin:1rem 0;border-radius:0 var(--radius) var(--radius) 0;font-size:.88rem}\n.info-box strong{color:var(--accent)}\n.info-box.warn{border-left-color:var(--accent4)}.info-box.danger{border-left-color:var(--accent3)}\n.toc{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.15rem 1.4rem;margin-bottom:2rem;box-shadow:var(--shadow)}\n.toc h3{margin:0 0 .5rem;font-size:.9rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}\n.toc ol{padding-left:1.1rem;columns:2;column-gap:2rem}\n.toc li{margin-bottom:.25rem;font-size:.88rem}.toc a{color:var(--ink)}.toc a:hover{color:var(--accent);text-decoration:none}\npre.code-block{background:var(--code-bg);padding:.85rem 1rem;border-radius:var(--radius);overflow-x:auto;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.5;margin:.6rem 0;border:1px solid var(--rule)}\ncode,.inline-code{background:var(--code-bg);padding:.12rem .4rem;border-radius:4px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.83rem;border:1px solid var(--rule)}\n.table-wrap{overflow-x:auto;margin:1.2rem 0}\ntable{width:100%;border-collapse:collapse;font-size:.82rem}\nthead th{background:var(--accent);color:#fff;padding:.6rem .5rem;text-align:center;font-weight:600;white-space:nowrap}\nthead th:first-child{border-radius:6px 0 0 0}thead th:last-child{border-radius:0 6px 0 0}\ntbody td{padding:.55rem .5rem;border-bottom:1px solid var(--rule);text-align:center;vertical-align:middle}\ntbody tr:nth-child(even){background:var(--bg)}\ntbody td:first-child{text-align:left;font-weight:600}\n.terminal{background:#1a1a2e;color:#a8e6cf;border-radius:var(--radius);padding:.9rem 1rem;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;line-height:1.6;margin:.6rem 0;overflow-x:auto;border:1px solid #333}\n.terminal .prompt{color:#60a5fa}.terminal .comment{color:#6c7086;font-style:italic}.terminal .output{color:#e2e4f0}\n[data-theme=\"dark\"] .terminal{background:#08081a}\n.steps{counter-reset:step;list-style:none;padding:0}\n.steps li{counter-increment:step;position:relative;padding:.85rem 1rem .85rem 2.8rem;margin-bottom:.5rem;border-left:2px solid var(--rule);border-radius:0 var(--radius) 0;background:var(--card-bg);box-shadow:var(--shadow)}\n.steps li::before{content:counter(step);position:absolute;left:-13px;top:.85rem;width:26px;height:26px;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700}\n.steps li .cmd{display:block;background:var(--code-bg);padding:.4rem .7rem;border-radius:5px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.82rem;margin:.3rem 0;overflow-x:auto;border:1px solid var(--rule)}\n.steps li .note{display:block;color:var(--muted);font-size:.82rem;margin-top:.2rem}\n.flow-diagram{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1.25rem;margin:1.25rem 0;text-align:center}\n.flow-row{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:.35rem;margin:.4rem 0}\n.flow-item{display:inline-block;padding:.4rem .8rem;border-radius:6px;font-weight:600;font-size:.82rem;text-align:center;background:var(--accent);color:#fff;min-width:60px}\n.flow-item.green{background:var(--accent2)}.flow-item.red{background:var(--accent3)}.flow-item.yellow{background:var(--accent4);color:#1a1a2e}.flow-item.purple{background:var(--accent5)}\n.flow-arrow{color:var(--muted);font-size:1rem}\n.cmd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:.75rem;margin:1rem 0}\n.cmd-card{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:.9rem;box-shadow:var(--shadow)}\n.cmd-card h4{margin:0 0 .35rem;font-size:.88rem;color:var(--accent)}\n.cmd-card .cmd{font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.8rem;background:var(--code-bg);padding:.3rem .5rem;border-radius:4px;display:block;margin-bottom:.3rem;border:1px solid var(--rule)}\n.cmd-card .desc{font-size:.8rem;color:var(--muted)}\n.two-col{display:grid;grid-template-columns:1fr 1fr;gap:1.25rem;margin:1.25rem 0}\n.compare-box{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1rem 0}\n.compare-col{background:var(--card-bg);border:1px solid var(--rule);border-radius:var(--radius);padding:1rem;box-shadow:var(--shadow)}\n.compare-col h4{margin:0 0 .4rem;font-size:.88rem}\n.compare-col.bad h4{color:var(--accent3)}\n.compare-col.good h4{color:var(--accent2)}\npre.example{background:var(--code-bg);padding:.6rem .8rem;border-radius:6px;font-family:\"SF Mono\",Consolas,\"Courier New\",monospace;font-size:.78rem;line-height:1.5;margin:.4rem 0;border:1px solid var(--rule);color:var(--ink)}\nfooter{max-width:940px;margin:3rem auto 0;padding:2rem 1.5rem 3rem;border-top:1px solid var(--rule);text-align:center;font-size:.82rem;color:var(--muted)}\nfooter .links{display:flex;justify-content:center;gap:1.5rem;flex-wrap:wrap;margin-bottom:.8rem}\nfooter .links a{color:var(--muted)}footer .links a:hover{color:var(--accent)}\n@media(max-width:640px){\n  h1{font-size:1.4rem}.toc ol{columns:1}.header-inner{padding:0 1rem}main{padding:72px 1rem 2rem}\n  .steps li{padding-left:2.4rem}.steps li::before{left:-11px;width:22px;height:font-size:.7rem}\n  .two-col{grid-template-columns:1fr}.cmd-grid{grid-template-columns:1fr}.compare-box{grid-template-columns:1fr}\n}\n<\/style>\n<\/head>\n<body>\n<header>\n  <div class=\"header-inner\">\n    <div class=\"logo\"><span>\u26a0\ufe0f<\/span> python-exceptions\u8be6\u7ec6\u8bf4\u660e<\/div>\n    <div class=\"controls\">\n      <div class=\"lang-switch\">\n        <button class=\"active\" onclick=\"setLang('zh')\" id=\"btn-zh\">\u4e2d\u6587<\/button>\n        <button onclick=\"setLang('en')\" id=\"btn-en\">English<\/button>\n      <\/div>\n      <button class=\"theme-toggle\" onclick=\"toggleTheme()\" title=\"\u5207\u6362\u660e\u6697\u4e3b\u9898\">&#9788;<\/button>\n    <\/div>\n  <\/div>\n<\/header>\n<main>\n<div class=\"lang-section active\" id=\"lang-zh\">\n<div class=\"hero\">\n  <h1>Python\u5f02\u5e38(Exception)\u96f6\u57fa\u7840\u5b8c\u6574\u6559\u7a0b\uff1a\u7406\u89e3\u3001\u4f7f\u7528\u3001\u6807\u51c6\u5316\u7ba1\u7406<\/h1>\n  <p class=\"sub\">\u96f6\u57fa\u7840\u5927\u767d\u8bdd\u8bb2\u89e3\uff0c\u8986\u76d6\u539f\u751f\u5f02\u5e38\u3001try-except-finally-else\u3001\u81ea\u5b9a\u4e49\u4e1a\u52a1\u5f02\u5e38\u3001\u5206\u5c42\u7edf\u4e00\u5f02\u5e38\u7ba1\u7406\u3001\u5de5\u7a0b\u843d\u5730\u89c4\u8303\u5168\u5185\u5bb9<\/p>\n<\/div>\n<div class=\"toc\">\n  <h3>\u76ee\u5f55<\/h3>\n  <ol>\n    <li><a href=\"#zh1\">\u4e00\u3001\u4ec0\u4e48\u662fException\u5f02\u5e38\uff1f\u4e3a\u4ec0\u4e48\u8981\u5904\u7406\u5f02\u5e38<\/a><\/li>\n    <li><a href=\"#zh2\">\u4e8c\u3001Python\u5f02\u5e38\u5e95\u5c42\u539f\u7406\u4e0e\u7ee7\u627f\u5c42\u7ea7<\/a><\/li>\n    <li><a href=\"#zh3\">\u4e09\u3001\u57fa\u7840\u8bed\u6cd5\uff1atry \/ except \/ else \/ finally \u5b8c\u6574\u7528\u6cd5<\/a><\/li>\n    <li><a href=\"#zh4\">\u56db\u3001\u5e38\u89c1\u5185\u7f6e\u539f\u751f\u5f02\u5e38\u573a\u666f\u4e0e\u6355\u83b7\u793a\u4f8b<\/a><\/li>\n    <li><a href=\"#zh5\">\u4e94\u3001\u4e3b\u52a8\u629b\u51fa\u5f02\u5e38 raise \u8bed\u6cd5<\/a><\/li>\n    <li><a href=\"#zh6\">\u516d\u3001\u81ea\u5b9a\u4e49\u4e1a\u52a1\u5f02\u5e38\uff08\u5de5\u4e1a\u9879\u76ee\u5fc5\u5907\uff09<\/a><\/li>\n    <li><a href=\"#zh7\">\u4e03\u3001\u5de5\u7a0b\u5316\u7edf\u4e00\u5f02\u5e38\u7ba1\u7406\u65b9\u6848\uff08\u5206\u5c42\u5c01\u88c5\uff09<\/a><\/li>\n    <li><a href=\"#zh8\">\u516b\u3001\u5f02\u5e38\u5904\u7406\u6700\u4f73\u5b9e\u8df5 &#038; \u907f\u5751\u7ea2\u7ebf<\/a><\/li>\n    <li><a href=\"#zh9\">\u4e5d\u3001\u5b8c\u6574\u9879\u76ee\u843d\u5730\u6a21\u677f\uff08common\u7edf\u4e00\u5f02\u5e38\u6587\u4ef6\uff09<\/a><\/li>\n  <\/ol>\n<\/div>\n\n<h2 id=\"zh1\">\u4e00\u3001\u4ec0\u4e48\u662fException\u5f02\u5e38\uff1f\u4e3a\u4ec0\u4e48\u8981\u5904\u7406\u5f02\u5e38<\/h2>\n<div class=\"card\">\n  <h4>1.1 \u96f6\u57fa\u7840\u901a\u4fd7\u89e3\u91ca<\/h4>\n  <p><strong>\u5f02\u5e38(Exception)<\/strong>\uff1a\u7a0b\u5e8f\u8fd0\u884c\u8fc7\u7a0b\u4e2d\u53d1\u751f\u7684\u975e\u9884\u671f\u9519\u8bef\u3002\u4ee3\u7801\u8bed\u6cd5\u9519\u8bef\u662f\u7f16\u8bd1\u62a5\u9519\uff0c\u5f02\u5e38\u662f\u8bed\u6cd5\u6ca1\u95ee\u9898\uff0c\u4f46\u8fd0\u884c\u65f6\u73af\u5883\/\u6570\u636e\u4e0d\u6ee1\u8db3\u8981\u6c42\u5bfc\u81f4\u5d29\u6e83\u3002<\/p>\n  <p>\u4e3e\u4f8b\u5b50\uff1a<\/p>\n  <ul>\n    <li>\u8bfb\u53d6\u4e0d\u5b58\u5728\u6587\u4ef6 \u2192 FileNotFoundError<\/li>\n    <li>\u5b57\u7b26\u4e32\u8f6c\u6570\u5b57\u5931\u8d25 \u2192 ValueError<\/li>\n    <li>\u7f51\u7edc\u63a5\u53e3\u8d85\u65f6 \u2192 \u7b2c\u4e09\u65b9\u5e93\u5f02\u5e38<\/li>\n    <li>\u6570\u7ec4\u4e0b\u6807\u8d85\u51fa\u8303\u56f4 \u2192 IndexError<\/li>\n  <\/ul>\n  <h4>1.2 \u4e0d\u5904\u7406\u5f02\u5e38\u7684\u81f4\u547d\u95ee\u9898<\/h4>\n  <div class=\"compare-box\">\n    <div class=\"compare-col bad\">\n      <h4>\u4e0d\u6355\u83b7\u5f02\u5e38\uff08\u7f3a\u70b9\uff09<\/h4>\n      <p>1. \u7a0b\u5e8f\u76f4\u63a5\u95ea\u9000\uff0c\u63a7\u5236\u53f0\u9ed1\u7a97\u53e3\u77ac\u95f4\u5173\u95ed\uff0c\u7528\u6237\u770b\u4e0d\u5230\u62a5\u9519\uff1b<\/p>\n      <p>2. \u65e0\u53cb\u597d\u4e2d\u6587\u63d0\u793a\uff0c\u65b0\u624b\u770b\u4e0d\u61c2\u82f1\u6587\u62a5\u9519\u6808\uff1b<\/p>\n      <p>3. \u4e2d\u95f4\u8d44\u6e90\uff08\u6587\u4ef6\u3001\u6570\u636e\u5e93\u8fde\u63a5\uff09\u4e0d\u4f1a\u81ea\u52a8\u5173\u95ed\uff0c\u9020\u6210\u8d44\u6e90\u6cc4\u6f0f\uff1b<\/p>\n      <p>4. \u65e0\u6cd5\u505a\u91cd\u8bd5\u3001\u964d\u7ea7\u3001\u65e5\u5fd7\u8bb0\u5f55\u7b49\u5bb9\u9519\u903b\u8f91\u3002<\/p>\n    <\/div>\n    <div class=\"compare-col good\">\n      <h4>\u6355\u83b7\u5904\u7406\u5f02\u5e38\uff08\u4f18\u52bf\uff09<\/h4>\n      <p>1. \u7a0b\u5e8f\u4e0d\u4f1a\u76f4\u63a5\u5d29\u6e83\uff0c\u7ed9\u51fa\u6e05\u6670\u53ef\u8bfb\u7684\u4e2d\u6587\u63d0\u793a\uff1b<\/p>\n      <p>2. \u81ea\u52a8\u91ca\u653e\u6587\u4ef6\/\u7f51\u7edc\/\u6570\u636e\u5e93\u8d44\u6e90\uff1b<\/p>\n      <p>3. \u53ef\u5b9e\u73b0\u81ea\u52a8\u91cd\u8bd5\u3001\u515c\u5e95\u9ed8\u8ba4\u503c\u3001\u65e5\u5fd7\u8bb0\u5f55\u9519\u8bef\uff1b<\/p>\n      <p>4. \u533a\u5206\u4e0d\u540c\u9519\u8bef\u7c7b\u578b\uff0c\u9488\u5bf9\u6027\u5904\u7406\u3002<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<h2 id=\"zh2\">\u4e8c\u3001Python\u5f02\u5e38\u5e95\u5c42\u539f\u7406\u4e0e\u7ee7\u627f\u5c42\u7ea7<\/h2>\n<div class=\"card\">\n  <h4>2.1 \u5f02\u5e38\u7ee7\u627f\u6811\uff08\u6838\u5fc3\u7ed3\u6784\uff09<\/h4>\n<pre class=\"code-block\">BaseException\n\u251c\u2500\u2500 SystemExit        # sys.exit()\u7a0b\u5e8f\u9000\u51fa\uff08\u4e0d\u5efa\u8bae\u6355\u83b7\uff09\n\u251c\u2500\u2500 KeyboardInterrupt # Ctrl+C\u624b\u52a8\u7ec8\u6b62\u7a0b\u5e8f\n\u2514\u2500\u2500 Exception         # \u6240\u6709\u4e1a\u52a1\u8fd0\u884c\u5f02\u5e38\u7236\u7c7b\uff08\u65e5\u5e38\u6355\u83b7\u8d77\u70b9\uff09\n    \u251c\u2500\u2500 ArithmeticError\uff08\u6570\u503c\uff09\n    \u2502   \u2514\u2500\u2500 ZeroDivisionError \u9664\u96f6\u9519\u8bef\n    \u251c\u2500\u2500 LookupError\uff08\u7d22\u5f15\/\u952e\uff09\n    \u2502   \u251c\u2500\u2500 IndexError \u5217\u8868\u4e0b\u6807\u8d8a\u754c\n    \u2502   \u2514\u2500\u2500 KeyError \u5b57\u5178\u952e\u4e0d\u5b58\u5728\n    \u251c\u2500\u2500 OSError\uff08\u6587\u4ef6\/\u7cfb\u7edf\uff09\n    \u2502   \u2514\u2500\u2500 FileNotFoundError \u6587\u4ef6\u4e0d\u5b58\u5728\n    \u251c\u2500\u2500 ValueError \u503c\u7c7b\u578b\u9519\u8bef\n    \u251c\u2500\u2500 TypeError \u7c7b\u578b\u4e0d\u5339\u914d\n    \u2514\u2500\u2500 \u81ea\u5b9a\u4e49\u4e1a\u52a1\u5f02\u5e38\uff08\u7ee7\u627fException\uff09\n<\/pre>\n  <div class=\"info-box\">\n    <strong>\u5173\u952e\u77e5\u8bc6\u70b9\uff1a<\/strong>\u65e5\u5e38\u4e1a\u52a1\u4ee3\u7801\u53ea\u6355\u83b7 <code>Exception<\/code> \u53ca\u5176\u5b50\u7c7b\uff0c\u4e0d\u8981\u6355\u83b7BaseException\uff0c\u4f1a\u62e6\u622aCtrl+C\u9000\u51fa\u4fe1\u53f7\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u65e0\u6cd5\u6b63\u5e38\u5173\u95ed\u3002\n  <\/div>\n<\/div>\n\n<h2 id=\"zh3\">\u4e09\u3001\u57fa\u7840\u8bed\u6cd5\uff1atry \/ except \/ else \/ finally \u5b8c\u6574\u7528\u6cd5<\/h2>\n<h3>3.1 \u56db\u6bb5\u8bed\u6cd5\u5b8c\u6574\u7ed3\u6784<\/h3>\n<pre class=\"code-block\">try:\n    # \u3010\u6838\u5fc3\u76d1\u63a7\u533a\u3011\u53ef\u80fd\u62a5\u9519\u7684\u4ee3\u7801\u653e\u8fd9\u91cc\n    code_that_may_error()\nexcept \u6307\u5b9a\u5f02\u5e38\u7c7b\u578b as e:\n    # \u3010\u5f02\u5e38\u5206\u652f\u3011\u6355\u83b7\u5230\u5bf9\u5e94\u9519\u8bef\u6267\u884c\n    handle_error(e)\nexcept Exception as e:\n    # \u3010\u515c\u5e95\u5206\u652f\u3011\u6240\u6709\u672a\u5339\u914d\u7684\u666e\u901a\u5f02\u5e38\n    handle_all_error(e)\nelse:\n    # \u3010\u65e0\u5f02\u5e38\u5206\u652f\u3011try\u4ee3\u7801\u5168\u90e8\u6210\u529f\u3001\u65e0\u62a5\u9519\u624d\u6267\u884c\n    success_logic()\nfinally:\n    # \u3010\u5fc5\u6267\u884c\u5206\u652f\u3011\u65e0\u8bba\u662f\u5426\u62a5\u9519\u3001\u662f\u5426return\u3001\u662f\u5426break\u90fd\u4f1a\u8fd0\u884c\n    release_resource()\n<\/pre>\n<div class=\"two-col\">\n  <div class=\"col\">\n    <h4>\u5404\u533a\u5757\u6267\u884c\u89c4\u5219<\/h4>\n    <ul>\n      <li>try\uff1a\u5fc5\u987b\u5b58\u5728\uff1b<\/li>\n      <li>except\uff1a\u81f3\u5c11\u4e00\u4e2a\uff0c\u53ef\u591a\u4e2a\u533a\u5206\u4e0d\u540c\u9519\u8bef\uff1b<\/li>\n      <li>else\uff1a\u53ef\u9009\uff0c\u4ec5\u65e0\u5f02\u5e38\u89e6\u53d1\uff1b<\/li>\n      <li>finally\uff1a\u53ef\u9009\uff0c\u65e0\u8bba\u5982\u4f55\u90fd\u4f1a\u6267\u884c\uff0c\u7528\u4e8e\u5173\u95ed\u6587\u4ef6\u3001\u8fde\u63a5\u3002<\/li>\n    <\/ul>\n  <\/div>\n  <div class=\"col\">\n    <h4>\u5b8c\u6574\u53ef\u8fd0\u884c\u793a\u4f8b<\/h4>\n<pre class=\"example\">try:\n    num = int(input(\"\u8f93\u5165\u6570\u5b57\uff1a\"))\n    res = 10 \/ num\nexcept ValueError:\n    print(\"\u8f93\u5165\u4e0d\u662f\u6570\u5b57\uff01\")\nexcept ZeroDivisionError:\n    print(\"\u4e0d\u80fd\u9664\u4ee50\uff01\")\nexcept Exception as e:\n    print(\"\u672a\u77e5\u9519\u8bef\", e)\nelse:\n    print(\"\u8ba1\u7b97\u7ed3\u679c\uff1a\", res)\nfinally:\n    print(\"\u7a0b\u5e8f\u672c\u6b21\u8f93\u5165\u6d41\u7a0b\u7ed3\u675f\")\n<\/pre>\n  <\/div>\n<\/div>\n<div class=\"info-box warn\">\n  <strong>\u907f\u5751\uff1a\u4e0d\u8981\u88f8except:<\/strong> \u4e0d\u5199\u5f02\u5e38\u7c7b\u578b\u4f1a\u6355\u83b7\u6240\u6709Exception\uff0c\u65e0\u6cd5\u533a\u5206\u9519\u8bef\uff0c\u4e0d\u5229\u4e8e\u6392\u9519\u3002\u5fc5\u987b\u6307\u5b9a\u5177\u4f53\u5f02\u5e38\u6216Exception\u515c\u5e95\u3002\n<\/div>\n\n<h2 id=\"zh4\">\u56db\u3001\u5e38\u89c1\u5185\u7f6e\u539f\u751f\u5f02\u5e38\u573a\u666f\u4e0e\u6355\u83b7\u793a\u4f8b<\/h2>\n<div class=\"table-wrap\">\n<table>\n  <thead>\n    <tr><th>\u5f02\u5e38\u7c7b<\/th><th>\u89e6\u53d1\u573a\u666f<\/th><th>\u7b80\u6613\u6355\u83b7\u793a\u4f8b<\/th><\/tr>\n  <\/thead>\n  <tbody>\n    <tr>\n      <td>ValueError<\/td>\n      <td>\u503c\u683c\u5f0f\u9519\u8bef\uff0c\u5b57\u7b26\u4e32\u8f6c\u6570\u5b57\u5931\u8d25<\/td>\n      <td>except ValueError as err:<\/td>\n    <\/tr>\n    <tr>\n      <td>TypeError<\/td>\n      <td>\u7c7b\u578b\u4e0d\u5339\u914d\uff0c\u6570\u5b57+\u5b57\u7b26\u4e32\u8fd0\u7b97<\/td>\n      <td>except TypeError as err:<\/td>\n    <\/tr>\n    <tr>\n      <td>IndexError<\/td>\n      <td>\u5217\u8868\u4e0b\u6807\u8d85\u8fc7\u957f\u5ea6<\/td>\n      <td>except IndexError as err:<\/td>\n    <\/tr>\n    <tr>\n      <td>KeyError<\/td>\n      <td>\u5b57\u5178\u65e0\u5bf9\u5e94key<\/td>\n      <td>except KeyError as err:<\/td>\n    <\/tr>\n    <tr>\n      <td>FileNotFoundError<\/td>\n      <td>\u6587\u4ef6\u8def\u5f84\u4e0d\u5b58\u5728<\/td>\n      <td>except FileNotFoundError as err:<\/td>\n    <\/tr>\n    <tr>\n      <td>ZeroDivisionError<\/td>\n      <td>\u9664\u6cd5\u5206\u6bcd\u4e3a0<\/td>\n      <td>except ZeroDivisionError as err:<\/td>\n    <\/tr>\n    <tr>\n      <td>OSError<\/td>\n      <td>\u6587\u4ef6\u6743\u9650\u3001\u7cfb\u7edf\u64cd\u4f5c\u5931\u8d25<\/td>\n      <td>except OSError as err:<\/td>\n    <\/tr>\n  <\/tbody>\n<\/table>\n<\/div>\n\n<h2 id=\"zh5\">\u4e94\u3001\u4e3b\u52a8\u629b\u51fa\u5f02\u5e38 raise \u8bed\u6cd5<\/h2>\n<div class=\"card\">\n  <h4>5.1 \u4f5c\u7528\u8bf4\u660e<\/h4>\n  <p>\u6355\u83b7\u662f\u5904\u7406\u8fd0\u884c\u81ea\u52a8\u4ea7\u751f\u7684\u9519\u8bef\uff0craise\u662f\u624b\u52a8\u4e3b\u52a8\u629b\u51fa\u5f02\u5e38\uff0c\u7528\u4e8e\u53c2\u6570\u6821\u9a8c\u3001\u4e1a\u52a1\u89c4\u5219\u62e6\u622a\u3002<\/p>\n  <h4>5.2 \u57fa\u7840\u8bed\u6cd5<\/h4>\n<pre class=\"code-block\"># \u57fa\u7840\u629b\u51fa\nraise ValueError(\"\u5e74\u9f84\u5fc5\u987b\u5927\u4e8e0\")\n\n# \u6355\u83b7\u540e\u91cd\u65b0\u629b\u51fa\u539f\u6709\u5f02\u5e38\ntry:\n    1\/0\nexcept ZeroDivisionError as e:\n    logger.error(e)\n    raise  # \u4e0d\u5e26\u53c2\u6570\uff0c\u539f\u6837\u629b\u51fa\u539f\u5f02\u5e38\n<\/pre>\n  <h4>5.3 \u4e1a\u52a1\u6821\u9a8c\u793a\u4f8b<\/h4>\n<pre class=\"example\">def check_age(age):\n    if not isinstance(age, int):\n        raise TypeError(\"\u5e74\u9f84\u5fc5\u987b\u662f\u6574\u6570\")\n    if age < 0 or age > 150:\n        raise ValueError(\"\u5e74\u9f84\u8303\u56f40~150\")\ncheck_age(-5)\n<\/pre>\n<\/div>\n\n<h2 id=\"zh6\">\u516d\u3001\u81ea\u5b9a\u4e49\u4e1a\u52a1\u5f02\u5e38\uff08\u5de5\u4e1a\u9879\u76ee\u5fc5\u5907\uff09<\/h2>\n<div class=\"card\">\n  <h4>6.1 \u4e3a\u4ec0\u4e48\u8981\u81ea\u5b9a\u4e49\u5f02\u5e38<\/h4>\n  <p>\u539f\u751f\u5f02\u5e38\u53ea\u6709\u901a\u7528\u7c7b\u578b\uff0c\u65e0\u6cd5\u533a\u5206\u4e1a\u52a1\u573a\u666f\uff1a\u6bd4\u5982\u540c\u6837ValueError\uff0c\u5206\u4e0d\u6e05\u662f\u7528\u6237\u8f93\u5165\u9519\u8bef\u8fd8\u662fAI\u5bc6\u94a5\u7f3a\u5931\u3002\u81ea\u5b9a\u4e49\u5f02\u5e38\u53ef\u4ee5\u7cbe\u51c6\u533a\u5206\u4e1a\u52a1\u6a21\u5757\uff0c\u7ed9\u51fa\u4e13\u5c5e\u63d0\u793a\uff0c\u7edf\u4e00\u9519\u8bef\u7801\u3002<\/p>\n  <h4>6.2 \u6807\u51c6\u81ea\u5b9a\u4e49\u5f02\u5e38\u5199\u6cd5\uff08\u7ee7\u627fException\uff09<\/h4>\n<pre class=\"code-block\"># \u6240\u6709\u4e1a\u52a1\u5f02\u5e38\u7236\u7c7b\nclass BaseBusinessError(Exception):\n    \"\"\"\u9879\u76ee\u6240\u6709\u4e1a\u52a1\u5f02\u5e38\u57fa\u7c7b\"\"\"\n    def __init__(self, msg: str, code: int = 400):\n        self.msg = msg\n        self.code = code\n        super().__init__(self.msg)\n\n# \u7ec6\u5206\u573a\u666f\u5f02\u5e38\nclass EnvMissingError(BaseBusinessError):\n    \"\"\".env\u73af\u5883\u53d8\u91cf\u7f3a\u5931\u5f02\u5e38\"\"\"\n    def __init__(msg=\"\u672a\u8bfb\u53d6\u5230\u73af\u5883\u5bc6\u94a5\", code=401):\n        super(msg, code)\n\nclass AIRequestError(BaseBusinessError):\n    \"\"\"AI\u63a5\u53e3\u8c03\u7528\u5931\u8d25\u5f02\u5e38\"\"\"\n\nclass FileOperateError(BaseBusinessError):\n    \"\"\"\u6587\u4ef6\u8bfb\u5199\u5f02\u5e38\"\"\"\n<\/pre>\n  <h4>6.3 \u4f7f\u7528\u65b9\u5f0f<\/h4>\n<pre class=\"example\">from common.exceptions import EnvMissingError\napi_key = None\nif not api_key:\n    raise EnvMissingError(\"AI_API_KEY\u672a\u914d\u7f6e\uff0c\u8bf7\u68c0\u67e5.env\u6587\u4ef6\")\n<\/pre>\n<\/div>\n\n<h2 id=\"zh7\">\u4e03\u3001\u5de5\u7a0b\u5316\u7edf\u4e00\u5f02\u5e38\u7ba1\u7406\u65b9\u6848\uff08\u5206\u5c42\u5c01\u88c5\uff09<\/h2>\n<div class=\"flow-diagram\">\n  <div class=\"flow-row\">\n    <span class=\"flow-item green\">common\/exceptions.py \u7edf\u4e00\u5f02\u5e38\u5b9a\u4e49<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item yellow\">\u5404service\u4e1a\u52a1\u5c42\u4e3b\u52a8raise\u81ea\u5b9a\u4e49\u5f02\u5e38<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item purple\">\u5165\u53e3main\/cli\u7edf\u4e00\u6355\u83b7\u515c\u5e95<\/span>\n    <span class=\"flow-arrow\">\u2192<\/span>\n    <span class=\"flow-item blue\">\u6253\u5370\u53cb\u597d\u63d0\u793a+\u8bb0\u5f55\u65e5\u5fd7<\/span>\n  <\/div>\n<\/div>\n<h3>\u5206\u5c42\u7ba1\u7406\u89c4\u8303<\/h3>\n<ol class=\"steps\">\n  <li>\u516c\u5171\u5c42common\/exceptions\uff1a\u96c6\u4e2d\u5b9a\u4e49\u5168\u90e8\u81ea\u5b9a\u4e49\u5f02\u5e38\uff0c\u5168\u5c40\u7edf\u4e00\uff1b<\/li>\n  <li>\u4e1a\u52a1service\u5c42\uff1a\u53c2\u6570\/\u914d\u7f6e\u6821\u9a8c\u65f6raise\u5bf9\u5e94\u81ea\u5b9a\u4e49\u5f02\u5e38\uff0c\u4e0d\u6253\u5370\u65e5\u5fd7\uff1b<\/li>\n  <li>\u6700\u5916\u5c42\u5165\u53e3\uff08main\u3001cli\u3001\u63a5\u53e3\u8def\u7531\uff09\u7edf\u4e00try-except\u6355\u83b7\uff1b<\/li>\n  <li>\u533a\u5206\u81ea\u5b9a\u4e49\u4e1a\u52a1\u5f02\u5e38\uff08\u53cb\u597d\u4e2d\u6587\u63d0\u793a\uff09\u548c\u7cfb\u7edf\u539f\u751f\u5f02\u5e38\uff08\u65e5\u5fd7\u6253\u5370\u5b8c\u6574\u5806\u6808\uff09\uff1b<\/li>\n  <li>finally\u7edf\u4e00\u91ca\u653e\u8d44\u6e90\uff1a\u6587\u4ef6\u3001\u7f51\u7edc\u8fde\u63a5\u3001\u6570\u636e\u5e93\u4f1a\u8bdd\u3002<\/li>\n<\/ol>\n<h3>\u5168\u5c40\u5165\u53e3\u7edf\u4e00\u6355\u83b7\u793a\u4f8b<\/h3>\n<pre class=\"code-block\">from common.exceptions import BaseBusinessError\nfrom common.logger import logger\n\ndef entry():\n    try:\n        business_logic()\n    # \u4f18\u5148\u6355\u83b7\u81ea\u5b9a\u4e49\u4e1a\u52a1\u5f02\u5e38\n    except BaseBusinessError as e:\n        print(f\"\u4e1a\u52a1\u63d0\u793a\uff1a{e.msg}\")\n        logger.warning(f\"\u4e1a\u52a1\u5f02\u5e38 code={e.code} msg={e.msg}\")\n    # \u515c\u5e95\u6355\u83b7\u7cfb\u7edf\u672a\u77e5\u5f02\u5e38\n    except Exception as e:\n        print(\"\u7a0b\u5e8f\u53d1\u751f\u672a\u77e5\u9519\u8bef\uff0c\u8bf7\u67e5\u770b\u65e5\u5fd7\")\n        logger.critical(\"\u672a\u77e5\u5d29\u6e83\", exc_info=True)\n    finally:\n        # \u91ca\u653e\u8d44\u6e90\n        close_all_connect()\n<\/pre>\n\n<h2 id=\"zh8\">\u516b\u3001\u5f02\u5e38\u5904\u7406\u6700\u4f73\u5b9e\u8df5 &#038; \u907f\u5751\u7ea2\u7ebf<\/h2>\n<div class=\"card\">\n  <h4>\u2705 \u63a8\u8350\u89c4\u8303<\/h4>\n  <ul>\n    <li>\u7cbe\u51c6\u6355\u83b7\u5177\u4f53\u5f02\u5e38\uff0c\u4e0d\u4f7f\u7528\u88f8except\uff1b<\/li>\n    <li>\u4e1a\u52a1\u573a\u666f\u5168\u90e8\u81ea\u5b9a\u4e49\u5f02\u5e38\uff0c\u533a\u5206\u9519\u8bef\u7801\u4e0e\u63d0\u793a\uff1b<\/li>\n    <li>\u53ea\u5728\u6700\u5916\u5c42\u5165\u53e3\u7edf\u4e00\u6355\u83b7\uff0c\u4e1a\u52a1\u4e2d\u95f4\u5c42\u5c3d\u91cf\u5411\u4e0a\u629b\u51fa\uff1b<\/li>\n    <li>\u6587\u4ef6\/\u8fde\u63a5\u64cd\u4f5c\u4f7f\u7528finally\u6216with\u81ea\u52a8\u91ca\u653e\uff1b<\/li>\n    <li>\u5f02\u5e38\u5fc5\u987b\u8bb0\u5f55\u65e5\u5fd7\uff0c\u533a\u5206warning\/error\/critical\u7b49\u7ea7\uff1b<\/li>\n    <li>\u4e0d\u8981\u541e\u6389\u5f02\u5e38\u4e0d\u505a\u4efb\u4f55\u5904\u7406\uff08\u53eaexcept\u4e0d\u6253\u5370\u65e5\u5fd7\uff09\u3002<\/li>\n  <\/ul>\n  <h4>\u274c \u7981\u6b62\u8e29\u5751\u64cd\u4f5c<\/h4>\n  <ul>\n    <li>\u88f8except: \u6355\u83b7\u5168\u90e8\u5f02\u5e38\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u95ee\u9898\uff1b<\/li>\n    <li>\u6355\u83b7BaseException\uff0c\u62e6\u622aCtrl+C\u9000\u51fa\uff1b<\/li>\n    <li>\u6355\u83b7\u5f02\u5e38\u540e\u65e0\u65e5\u5fd7\u3001\u65e0\u63d0\u793a\uff0c\u9759\u9ed8\u5931\u8d25\uff1b<\/li>\n    <li>\u591a\u5c42\u91cd\u590d\u6355\u83b7\u540c\u4e00\u5f02\u5e38\uff0c\u5806\u6808\u6df7\u4e71\uff1b<\/li>\n    <li>\u5927\u91cftry\u5305\u88f9\u6574\u6bb5\u4ee3\u7801\uff0c\u7c92\u5ea6\u592a\u7c97\uff0c\u5206\u4e0d\u6e05\u54ea\u884c\u62a5\u9519\u3002<\/li>\n  <\/ul>\n<\/div>\n\n<h2 id=\"zh9\">\u4e5d\u3001\u5b8c\u6574\u9879\u76ee\u843d\u5730\u6a21\u677f\uff08common\u7edf\u4e00\u5f02\u5e38\u6587\u4ef6\uff09<\/h2>\n<h3>\u6587\u4ef6\u8def\u5f84\uff1acommon\/exceptions.py<\/h3>\n<pre class=\"code-block\">\n\"\"\"\u9879\u76ee\u5168\u5c40\u7edf\u4e00\u81ea\u5b9a\u4e49\u5f02\u5e38\u6a21\u5757\"\"\"\n\nclass BaseAppErr(Exception):\n    \"\"\"\u7a0b\u5e8f\u6240\u6709\u4e1a\u52a1\u5f02\u5e38\u7236\u7c7b\"\"\"\n    def __init__(self, message: str, err_code: int = 400):\n        self.message = message\n        self.err_code = err_code\n        super().__init__(self.message)\n\n# \u73af\u5883\u914d\u7f6e\u7c7b\u5f02\u5e38\nclass EnvMissingError(BaseAppErr):\n    def __init__(self, msg=\"\u7f3a\u5931\u5fc5\u8981\u73af\u5883\u914d\u7f6e\", code=401):\n        super(msg, code)\n\n# AI\u63a5\u53e3\u7c7b\u5f02\u5e38\nclass AICallError(BaseAppErr):\n    pass\n\n# \u6587\u4ef6\u64cd\u4f5c\u5f02\u5e38\nclass FileIoError(BaseAppErr):\n    pass\n\n# \u53c2\u6570\u6821\u9a8c\u5f02\u5e38\nclass ParamInvalidError(BaseAppErr):\n    pass\n<\/pre>\n<h3>\u4f7f\u7528\u793a\u4f8b config\/settings.py<\/h3>\n<pre class=\"code-block\">import os\nfrom common.exceptions import EnvMissingError\n\nAPI_KEY = os.getenv(\"AI_API_KEY\")\nif not API_KEY:\n    raise EnvMissingError(\"AI_API\u5bc6\u94a5\u672a\u586b\u5199\uff0c\u8bf7\u4fee\u6539.env.dev\u6587\u4ef6\")\n<\/pre>\n<h3>\u5165\u53e3main.py\u5168\u5c40\u6355\u83b7<\/h3>\n<pre class=\"code-block\">\nfrom common.exceptions import BaseAppErr\nfrom common.logger import logger\nfrom api.cli import run_cli\n\nif __name__ == \"__main__\":\n    try:\n        run_cli()\n    except KeyboardInterrupt:\n        logger.info(\"\u7528\u6237\u624b\u52a8\u7ec8\u6b62\u7a0b\u5e8f\")\n    except BaseAppErr as e:\n        print(f\"\\n\u3010\u4e1a\u52a1\u9519\u8bef\u3011{e.message}\")\n        logger.warning(f\"\u4e1a\u52a1\u5f02\u5e38 code={e.err_code} {e.message}\")\n    except Exception as err:\n        print(\"\\n\u3010\u672a\u77e5\u7cfb\u7edf\u9519\u8bef\u3011\u8be6\u7ec6\u4fe1\u606f\u8bf7\u67e5\u770b\u65e5\u5fd7\")\n        logger.critical(\"\u7a0b\u5e8f\u5d29\u6e83\", exc_info=True)\n<\/pre>\n<\/div>\n<\/div>\n\n<div class=\"lang-section\" id=\"lang-en\">\n<div class=\"hero\">\n  <h1>Python Exceptions Full Beginner Guide: Understand, Use &#038; Standardized Management<\/h1>\n  <p class=\"sub\">Basic syntax, try-except-else-finally, custom business exceptions, industrial project layer management<\/p>\n<\/div>\n<div class=\"toc\">\n  <h3>Table of Contents<\/h3>\n  <ol>\n    <li><a href=\"#e1\">1 What is Exception &#038; Why Handle Errors<\/a><\/li>\n    <li><a href=\"#e2\">Python Exception Inheritance Tree<\/a><\/li>\n    <li><a href=\"#e3\">try \/ except \/ else \/ finally Full Syntax<\/a><\/li>\n    <li><a href=\"#e4\">Common Built-in Exceptions &#038; Cases<\/a><\/li>\n    <li><a href=\"#e5\">raise Manually Throw Exceptions<\/a><\/li>\n    <li><a href=\"#e6\">Custom Business Exceptions<\/a><\/li>\n    <li><a href=\"#e7\">Project-Wide Unified Exception Management<\/a><\/li>\n    <li><a href=\"#e8\">Best Practices &#038; Anti-Patterns<\/a><\/li>\n    <li><a href=\"#e9\">Full Project Template exceptions.py<\/a><\/li>\n  <\/ol>\n<\/div>\n<h2 id=\"e1\">1 What is Exception<\/h2>\n<p>Exception is runtime error when syntax is correct but data\/environment invalid. Unhandled exceptions crash program directly, break resource release. Catching exceptions keeps program alive with readable prompt.<\/p>\n<h2 id=\"e2\">Exception Hierarchy<\/h2>\n<p>BaseException \u2192 SystemExit \/ KeyboardInterrupt \/ Exception. All business errors inherit Exception, do not catch BaseException.<\/p>\n<h2 id=\"e3\">Core Syntax<\/h2>\n<pre class=\"code-block\">try:\n    risky_code()\nexcept ValueError as e:\n    handle_value_err()\nexcept Exception as e:\n    fallback()\nelse:\n    run_when_no_error()\nfinally:\n    always_run_release()\n<\/pre>\n<h2 id=\"e4\">Built-in Exceptions List<\/h2>\n<p>ValueError \/ TypeError \/ IndexError \/ KeyError \/ FileNotFoundError \/ ZeroDivisionError \/ OSError<\/p>\n<h2 id=\"e5\">raise Statement<\/h2>\n<pre class=\"code-block\">raise ValueError(\"Invalid input age\")\n# re-throw original error\ntry:1\/0\nexcept ZeroDivisionError:raise\n<\/pre>\n<h2 id=\"e6\">Custom Exceptions<\/h2>\n<pre class=\"code-block\">class BaseBizErr(Exception):\n    def __init__(msg, code=400):\n        super(msg)\n        self.code = code\nclass EnvError(BaseBizErr):pass\n<\/pre>\n<h2 id=\"e7\">Project Layer Management<\/h2>\n<p>1. Centralized exceptions.py in common folder<\/p>\n<p>2. Service layer raise custom error<\/p>\n<p>3. Entry main.py global catch &#038; log<\/p>\n<h2 id=\"e8\">Best Rules<\/h2>\n<p>\u2705 Catch specific error, custom exception for business, log all errors, release resource in finally<\/p>\n<p>\u274c Bare except, catch BaseException, silent ignore errors<\/p>\n<h2 id=\"e9\">Full Template common\/exceptions.py<\/h2>\n<pre class=\"code-block\">class BaseAppErr(Exception):\n    def __init__(self, msg, code=400):\n        self.msg=msg\n        self.code=code\nclass EnvMissingError(BaseAppErr):pass\nclass AICallError(BaseAppErr):pass\n<\/pre>\n<\/div>\n<\/main>\n<script>\nfunction setLang(lang){\n  document.querySelectorAll('.lang-section').forEach(el=>el.classList.remove('active'));\n  document.getElementById('lang-'+lang).classList.add('active');\n  document.querySelectorAll('.lang-switch button').forEach(btn=>btn.classList.remove('active'));\n  document.getElementById('btn-'+lang).classList.add('active');\n  document.documentElement.lang = lang==='zh'?'zh-CN':'en';\n  const prefix = lang==='zh';\n  const newHash = window.location.hash.replace(\/^#(zh|en)-\/, prefix?\"zh\":\"en\");\n  if(newHash) window.location.hash = newHash;\n}\nfunction toggleTheme(){\n  const html = document.documentElement;\n  if(html.hasAttribute('data-theme')){\n    html.removeAttribute('data-theme');\n    localStorage.removeItem('theme')\n  }else{\n    html.setAttribute('data-theme','dark');\n    localStorage.setItem('dark')\n  }\n}\n(function(){\n  if(localStorage.getItem('theme')==='dark') document.documentElement.setAttribute('data-theme','dark');\n  const hash = window.location.hash;\n  if(hash){\n    const target = document.querySelector(hash);\n    if(target) setTimeout(()=>target.scrollIntoView({behavior:'smooth'}),100);\n  }\n})();\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>python-exceptions\u8be6\u7ec6\u8bf4\u660e \u26a0\ufe0f python-exceptions\u8be6\u7ec6\u8bf4\u660e \u4e2d\u6587 Engli [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,9],"tags":[],"class_list":["post-333","post","type-post","status-publish","format-standard","hentry","category-cad","category-ai"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/333","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=333"}],"version-history":[{"count":1,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/333\/revisions"}],"predecessor-version":[{"id":334,"href":"https:\/\/numsimlab.com\/index.php?rest_route=\/wp\/v2\/posts\/333\/revisions\/334"}],"wp:attachment":[{"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/numsimlab.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}