{"id":2575,"date":"2025-03-24T08:47:00","date_gmt":"2025-03-23T23:47:00","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2575"},"modified":"2025-03-24T08:47:29","modified_gmt":"2025-03-23T23:47:29","slug":"laravel-exception%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bc%9a%e5%ae%9f%e8%b7%b5%e7%9a%84%e3%81%aa%e3%82%a8%e3%83%a9%e3%83%bc%e5%87%a6%e7%90%86%e3%81%a89%e3%81%a4%e3%81%ae%e3%83%99","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2575","title":{"rendered":"Laravel Exception\u306e\u5b8c\u5168\u30ac\u30a4\u30c9\uff1a\u5b9f\u8df5\u7684\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u30689\u3064\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u30102025\u5e74\u7248\u3011"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-2\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-3\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-4\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-5\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-6\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-7\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-10\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-11\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-12\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-13\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-14\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-15\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-16\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-17\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-18\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-19\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-20\">\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-21\">\u610f\u5473\u306e\u3042\u308b\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u8a08<\/a>      <\/li>      <li>        <a href=\"#i-22\">\u6b63\u3057\u3044\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u306e\u4f5c\u6210<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-24\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-25\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-26\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-27\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-28\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-29\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-30\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-31\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-32\">\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-33\">\u610f\u5473\u306e\u3042\u308b\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u8a08<\/a>      <\/li>      <li>        <a href=\"#i-34\">\u6b63\u3057\u3044\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-35\">\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u306e\u4f5c\u6210<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-36\">\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-37\">\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u6d3b\u7528<\/a>      <\/li>      <li>        <a href=\"#i-38\">API\u306e\u30a8\u30e9\u30fc\u5bfe\u5fdc\u8a2d\u8a08<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-39\">\u975e\u540c\u671f\u51e6\u7406\u306b\u304a\u3051\u308b\u4f8b\u5916\u51e6\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-40\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-41\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-42\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-43\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-44\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-45\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-46\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-47\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-48\">\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-49\">\u610f\u5473\u306e\u3042\u308b\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u8a08<\/a>      <\/li>      <li>        <a href=\"#i-50\">\u6b63\u3057\u3044\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-51\">\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u306e\u4f5c\u6210<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-52\">\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-53\">\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u6d3b\u7528<\/a>      <\/li>      <li>        <a href=\"#i-54\">API\u306e\u30a8\u30e9\u30fc\u5bfe\u5fdc\u8a2d\u8a08<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-55\">\u975e\u540c\u671f\u51e6\u7406\u306b\u304a\u3051\u308b\u4f8b\u5916\u51e6\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-56\">\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-57\">\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-58\">\u4e00\u822c\u7684\u306a\u4f8b\u5916\u30d1\u30bf\u30fc\u30f3\u3068\u89e3\u6c7a\u7b56<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-59\">\u672c\u756a\u74b0\u5883\u3067\u306e\u4f8b\u5916\u76e3\u8996\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-60\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-61\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/a>      <\/li>      <li>        <a href=\"#i-62\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-63\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-64\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-65\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-66\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-67\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-68\">\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-69\">\u610f\u5473\u306e\u3042\u308b\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u8a08<\/a>      <\/li>      <li>        <a href=\"#i-70\">\u6b63\u3057\u3044\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-71\">\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u306e\u4f5c\u6210<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-72\">\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u624b\u6cd5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-73\">\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u6d3b\u7528<\/a>      <\/li>      <li>        <a href=\"#i-74\">API\u306e\u30a8\u30e9\u30fc\u5bfe\u5fdc\u8a2d\u8a08<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-75\">\u975e\u540c\u671f\u51e6\u7406\u306b\u304a\u3051\u308b\u4f8b\u5916\u51e6\u7406<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-76\">\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-77\">\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-78\">\u4e00\u822c\u7684\u306a\u4f8b\u5916\u30d1\u30bf\u30fc\u30f3\u3068\u89e3\u6c7a\u7b56<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-79\">\u672c\u756a\u74b0\u5883\u3067\u306e\u4f8b\u5916\u76e3\u8996\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-80\">Laravel \u4f8b\u5916\u306e\u30c6\u30b9\u30c8<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-81\">\u4f8b\u5916\u51e6\u7406\u306e\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u4f5c\u6210<\/a>      <\/li>      <li>        <a href=\"#i-82\">\u30e2\u30c3\u30af\u3092\u4f7f\u7528\u3057\u305f\u4f8b\u5916\u30c6\u30b9\u30c8<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-83\">\u30c6\u30b9\u30c8\u74b0\u5883\u3067\u306e\u4f8b\u5916\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u975e\u5e38\u306b\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u7279\u306bLaravel\u306e\u3088\u3046\u306a\u672c\u756a\u74b0\u5883\u3067\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u306f\u3001\u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u4ee5\u4e0b\u306e\u7406\u7531\u304b\u3089\u4e0d\u53ef\u6b20\u3068\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4fe1\u983c\u6027\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u3092\u9069\u5207\u306b\u30ad\u30e3\u30c3\u30c1\u3057\u51e6\u7406<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u7dad\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u60c5\u5831\u306e\u6f0f\u6d29\u9632\u6b62<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u3088\u308b\u8106\u5f31\u6027\u9732\u51fa\u306e\u56de\u907f<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ed\u30b0\u8a18\u9332\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u306e\u5b9f\u73fe<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u306e\u52b9\u7387\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u63d0\u4f9b<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-2\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>Laravel\u306eException\u306e\u4ed5\u7d44\u307f\u306f\u3001PHP\u306e\u4f8b\u5916\u51e6\u7406\u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u57fa\u76e4\u3068\u3057\u306a\u304c\u3089\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u56fa\u6709\u306e\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ \u6f5c\u5728\u7684\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c9\n    $result = $this-&gt;someRiskyOperation();\n} catch (Exception $e) {\n    \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n    Log::error('\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: ' . $e-&gt;getMessage());\n    return response()-&gt;json(['error' =&gt; '\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f'], 500);\n} finally {\n    \/\/ \u5fc5\u305a\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\n    $this-&gt;cleanup();\n}<\/pre>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u51e6\u7406\u306e\u6d41\u308c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f8b\u5916\u306e\u767a\u751f<\/li>\n\n\n\n<li>\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u751f\u6210<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-3\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/h3>\n\n\n\n<p>Laravel\u306b\u306f\u69d8\u3005\u306a\u7d44\u307f\u8fbc\u307f\u4f8b\u5916\u30af\u30e9\u30b9\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Exception<\/code>: \u3059\u3079\u3066\u306e\u4f8b\u5916\u306e\u57fa\u5e95\u30af\u30e9\u30b9<\/li>\n\n\n\n<li><code>RuntimeException<\/code>: \u5b9f\u884c\u6642\u306e\u4f8b\u5916<\/li>\n\n\n\n<li><code>LogicException<\/code>: \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30b8\u30c3\u30af\u30a8\u30e9\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Laravel\u56fa\u6709\u306e\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30e2\u30c7\u30eb\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u4f8b\u5916\n   use Illuminate\\Database\\Eloquent\\ModelNotFoundException;\n\n   \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5931\u6557\u6642\u306e\u4f8b\u5916\n   use Illuminate\\Validation\\ValidationException;\n\n   \/\/ \u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u4f8b\u5916\n   use Illuminate\\Auth\\AuthenticationException;\n   use Illuminate\\Auth\\Access\\AuthorizationException;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u968e\u5c64\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   Exception\n   \u251c\u2500\u2500 RuntimeException\n   \u2502   \u251c\u2500\u2500 ModelNotFoundException\n   \u2502   \u2514\u2500\u2500 ValidationException\n   \u2514\u2500\u2500 LogicException\n       \u2514\u2500\u2500 AuthorizationException<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u3001\u305d\u308c\u305e\u308c\u7279\u5b9a\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u304a\u308a\u3001\u9069\u5207\u306aHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3084\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u4f7f\u3044\u5206\u3051\u308b<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306f\u65e2\u5b58\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3066\u4f5c\u6210<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u304b\u3064\u9069\u5207\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u304c\u3001Laravel Exception\u306e\u57fa\u672c\u7684\u306a\u6982\u5ff5\u3068\u4ed5\u7d44\u307f\u3067\u3059\u3002\u3053\u308c\u3089\u306e\u7406\u89e3\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5\u306e\u57fa\u790e\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-4\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-5\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u975e\u5e38\u306b\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u7279\u306bLaravel\u306e\u3088\u3046\u306a\u672c\u756a\u74b0\u5883\u3067\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u306f\u3001\u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u4ee5\u4e0b\u306e\u7406\u7531\u304b\u3089\u4e0d\u53ef\u6b20\u3068\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4fe1\u983c\u6027\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u3092\u9069\u5207\u306b\u30ad\u30e3\u30c3\u30c1\u3057\u51e6\u7406<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u7dad\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u60c5\u5831\u306e\u6f0f\u6d29\u9632\u6b62<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u3088\u308b\u8106\u5f31\u6027\u9732\u51fa\u306e\u56de\u907f<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ed\u30b0\u8a18\u9332\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u306e\u5b9f\u73fe<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u306e\u52b9\u7387\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u63d0\u4f9b<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-6\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>Laravel\u306eException\u306e\u4ed5\u7d44\u307f\u306f\u3001PHP\u306e\u4f8b\u5916\u51e6\u7406\u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u57fa\u76e4\u3068\u3057\u306a\u304c\u3089\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u56fa\u6709\u306e\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ \u6f5c\u5728\u7684\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c9\n    $result = $this-&gt;someRiskyOperation();\n} catch (Exception $e) {\n    \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n    Log::error('\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: ' . $e-&gt;getMessage());\n    return response()-&gt;json(['error' =&gt; '\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f'], 500);\n} finally {\n    \/\/ \u5fc5\u305a\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\n    $this-&gt;cleanup();\n}<\/pre>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u51e6\u7406\u306e\u6d41\u308c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f8b\u5916\u306e\u767a\u751f<\/li>\n\n\n\n<li>\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u751f\u6210<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-7\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/h3>\n\n\n\n<p>Laravel\u306b\u306f\u69d8\u3005\u306a\u7d44\u307f\u8fbc\u307f\u4f8b\u5916\u30af\u30e9\u30b9\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Exception<\/code>: \u3059\u3079\u3066\u306e\u4f8b\u5916\u306e\u57fa\u5e95\u30af\u30e9\u30b9<\/li>\n\n\n\n<li><code>RuntimeException<\/code>: \u5b9f\u884c\u6642\u306e\u4f8b\u5916<\/li>\n\n\n\n<li><code>LogicException<\/code>: \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30b8\u30c3\u30af\u30a8\u30e9\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Laravel\u56fa\u6709\u306e\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30e2\u30c7\u30eb\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u4f8b\u5916\n   use Illuminate\\Database\\Eloquent\\ModelNotFoundException;\n\n   \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5931\u6557\u6642\u306e\u4f8b\u5916\n   use Illuminate\\Validation\\ValidationException;\n\n   \/\/ \u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u4f8b\u5916\n   use Illuminate\\Auth\\AuthenticationException;\n   use Illuminate\\Auth\\Access\\AuthorizationException;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u968e\u5c64\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   Exception\n   \u251c\u2500\u2500 RuntimeException\n   \u2502   \u251c\u2500\u2500 ModelNotFoundException\n   \u2502   \u2514\u2500\u2500 ValidationException\n   \u2514\u2500\u2500 LogicException\n       \u2514\u2500\u2500 AuthorizationException<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u3001\u305d\u308c\u305e\u308c\u7279\u5b9a\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u304a\u308a\u3001\u9069\u5207\u306aHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3084\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u4f7f\u3044\u5206\u3051\u308b<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306f\u65e2\u5b58\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3066\u4f5c\u6210<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u304b\u3064\u9069\u5207\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u304c\u3001Laravel Exception\u306e\u57fa\u672c\u7684\u306a\u6982\u5ff5\u3068\u4ed5\u7d44\u307f\u3067\u3059\u3002\u3053\u308c\u3089\u306e\u7406\u89e3\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5\u306e\u57fa\u790e\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306b\u3001\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace App\\Exceptions;\n\nuse Exception;\n\nclass PaymentFailedException extends Exception\n{\n    protected $message = '\u6c7a\u6e08\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f';\n    protected $code = 500;\n\n    public function report()\n    {\n        \/\/ \u30a8\u30e9\u30fc\u306e\u30ed\u30b0\u8a18\u9332\n        \\Log::error('\u6c7a\u6e08\u30a8\u30e9\u30fc: ' . $this-&gt;getMessage());\n    }\n\n    public function render($request)\n    {\n        \/\/ API\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        if ($request-&gt;expectsJson()) {\n            return response()-&gt;json([\n                'error' =&gt; $this-&gt;getMessage(),\n                'code' =&gt; $this-&gt;code\n            ], $this-&gt;code);\n        }\n\n        \/\/ \u901a\u5e38\u306eWeb\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        return view('errors.payment', [\n            'message' =&gt; $this-&gt;getMessage()\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function __construct($message = null, $code = 0, Exception $previous = null)\n{\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u3042\u308b\u5834\u5408\u306f\u4e0a\u66f8\u304d\n    if (!is_null($message)) {\n        $this-&gt;message = $message;\n    }\n\n    parent::__construct($this-&gt;message, $code, $previous);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-10\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d3\u30b9\u30af\u30e9\u30b9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            \/\/ \u6c7a\u6e08\u51e6\u7406\n            $result = $this-&gt;paymentGateway-&gt;charge($order-&gt;amount);\n\n            if (!$result-&gt;isSuccessful()) {\n                throw new PaymentFailedException(\n                    '\u6c7a\u6e08\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f: ' . $result-&gt;getMessage()\n                );\n            }\n\n            return $result;\n\n        } catch (PaymentFailedException $e) {\n            \/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u4f8b\u5916\u51e6\u7406\n            report($e);\n            throw $e;\n\n        } catch (\\Exception $e) {\n            \/\/ \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916\u306e\u51e6\u7406\n            report($e);\n            throw new PaymentFailedException(\n                '\u6c7a\u6e08\u51e6\u7406\u4e2d\u306b\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f',\n                500,\n                $e\n            );\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderController extends Controller\n{\n    public function store(OrderRequest $request)\n    {\n        try {\n            $order = $this-&gt;orderService-&gt;createOrder($request-&gt;validated());\n            $this-&gt;paymentService-&gt;processPayment($order);\n\n            return redirect()\n                -&gt;route('orders.show', $order)\n                -&gt;with('success', '\u6ce8\u6587\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f');\n\n        } catch (PaymentFailedException $e) {\n            return back()\n                -&gt;withInput()\n                -&gt;withErrors(['payment' =&gt; $e-&gt;getMessage()]);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-11\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u4f8b\u5916\u3068HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u9069\u5207\u306b\u9023\u643a\u3055\u305b\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ec\u30b9\u30dd\u30f3\u30b9\u30c8\u30ec\u30a4\u30c8\u306e\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Illuminate\\Http\\Response;\nuse Symfony\\Component\\HttpKernel\\Exception\\HttpException;\n\nclass ApiException extends HttpException\n{\n    public function __construct($message = null, $code = Response::HTTP_BAD_REQUEST)\n    {\n        parent::__construct($code, $message ?? 'API\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f');\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\nprotected $statusCodeMapping = [\n    ModelNotFoundException::class =&gt; 404,\n    AuthorizationException::class =&gt; 403,\n    ValidationException::class =&gt; 422,\n    PaymentFailedException::class =&gt; 400\n];\n\npublic function render($request, Throwable $e)\n{\n    $statusCode = $this-&gt;statusCodeMapping[get_class($e)] ?? 500;\n\n    if ($request-&gt;expectsJson()) {\n        return response()-&gt;json([\n            'error' =&gt; $e-&gt;getMessage(),\n            'status' =&gt; $statusCode\n        ], $statusCode);\n    }\n\n    return parent::render($request, $e);\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u8a2d\u8a08\u3059\u308b<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3092\u7d71\u4e00\u3059\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u8a18\u9332\u3068\u30a8\u30e9\u30fc\u901a\u77e5\u3092\u9069\u5207\u306b\u8a2d\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>API\u3068Web\u753b\u9762\u3067\u9069\u5207\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u3059<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8a2d\u5b9a\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-12\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-13\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u975e\u5e38\u306b\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u7279\u306bLaravel\u306e\u3088\u3046\u306a\u672c\u756a\u74b0\u5883\u3067\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u306f\u3001\u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u4ee5\u4e0b\u306e\u7406\u7531\u304b\u3089\u4e0d\u53ef\u6b20\u3068\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4fe1\u983c\u6027\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u3092\u9069\u5207\u306b\u30ad\u30e3\u30c3\u30c1\u3057\u51e6\u7406<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u7dad\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u60c5\u5831\u306e\u6f0f\u6d29\u9632\u6b62<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u3088\u308b\u8106\u5f31\u6027\u9732\u51fa\u306e\u56de\u907f<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ed\u30b0\u8a18\u9332\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u306e\u5b9f\u73fe<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u306e\u52b9\u7387\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u63d0\u4f9b<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>Laravel\u306eException\u306e\u4ed5\u7d44\u307f\u306f\u3001PHP\u306e\u4f8b\u5916\u51e6\u7406\u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u57fa\u76e4\u3068\u3057\u306a\u304c\u3089\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u56fa\u6709\u306e\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ \u6f5c\u5728\u7684\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c9\n    $result = $this-&gt;someRiskyOperation();\n} catch (Exception $e) {\n    \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n    Log::error('\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: ' . $e-&gt;getMessage());\n    return response()-&gt;json(['error' =&gt; '\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f'], 500);\n} finally {\n    \/\/ \u5fc5\u305a\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\n    $this-&gt;cleanup();\n}<\/pre>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u51e6\u7406\u306e\u6d41\u308c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f8b\u5916\u306e\u767a\u751f<\/li>\n\n\n\n<li>\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u751f\u6210<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-15\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/h3>\n\n\n\n<p>Laravel\u306b\u306f\u69d8\u3005\u306a\u7d44\u307f\u8fbc\u307f\u4f8b\u5916\u30af\u30e9\u30b9\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Exception<\/code>: \u3059\u3079\u3066\u306e\u4f8b\u5916\u306e\u57fa\u5e95\u30af\u30e9\u30b9<\/li>\n\n\n\n<li><code>RuntimeException<\/code>: \u5b9f\u884c\u6642\u306e\u4f8b\u5916<\/li>\n\n\n\n<li><code>LogicException<\/code>: \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30b8\u30c3\u30af\u30a8\u30e9\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Laravel\u56fa\u6709\u306e\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30e2\u30c7\u30eb\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u4f8b\u5916\n   use Illuminate\\Database\\Eloquent\\ModelNotFoundException;\n\n   \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5931\u6557\u6642\u306e\u4f8b\u5916\n   use Illuminate\\Validation\\ValidationException;\n\n   \/\/ \u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u4f8b\u5916\n   use Illuminate\\Auth\\AuthenticationException;\n   use Illuminate\\Auth\\Access\\AuthorizationException;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u968e\u5c64\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   Exception\n   \u251c\u2500\u2500 RuntimeException\n   \u2502   \u251c\u2500\u2500 ModelNotFoundException\n   \u2502   \u2514\u2500\u2500 ValidationException\n   \u2514\u2500\u2500 LogicException\n       \u2514\u2500\u2500 AuthorizationException<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u3001\u305d\u308c\u305e\u308c\u7279\u5b9a\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u304a\u308a\u3001\u9069\u5207\u306aHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3084\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u4f7f\u3044\u5206\u3051\u308b<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306f\u65e2\u5b58\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3066\u4f5c\u6210<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u304b\u3064\u9069\u5207\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u304c\u3001Laravel Exception\u306e\u57fa\u672c\u7684\u306a\u6982\u5ff5\u3068\u4ed5\u7d44\u307f\u3067\u3059\u3002\u3053\u308c\u3089\u306e\u7406\u89e3\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5\u306e\u57fa\u790e\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-16\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-17\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306b\u3001\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace App\\Exceptions;\n\nuse Exception;\n\nclass PaymentFailedException extends Exception\n{\n    protected $message = '\u6c7a\u6e08\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f';\n    protected $code = 500;\n\n    public function report()\n    {\n        \/\/ \u30a8\u30e9\u30fc\u306e\u30ed\u30b0\u8a18\u9332\n        \\Log::error('\u6c7a\u6e08\u30a8\u30e9\u30fc: ' . $this-&gt;getMessage());\n    }\n\n    public function render($request)\n    {\n        \/\/ API\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        if ($request-&gt;expectsJson()) {\n            return response()-&gt;json([\n                'error' =&gt; $this-&gt;getMessage(),\n                'code' =&gt; $this-&gt;code\n            ], $this-&gt;code);\n        }\n\n        \/\/ \u901a\u5e38\u306eWeb\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        return view('errors.payment', [\n            'message' =&gt; $this-&gt;getMessage()\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function __construct($message = null, $code = 0, Exception $previous = null)\n{\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u3042\u308b\u5834\u5408\u306f\u4e0a\u66f8\u304d\n    if (!is_null($message)) {\n        $this-&gt;message = $message;\n    }\n\n    parent::__construct($this-&gt;message, $code, $previous);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-18\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d3\u30b9\u30af\u30e9\u30b9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            \/\/ \u6c7a\u6e08\u51e6\u7406\n            $result = $this-&gt;paymentGateway-&gt;charge($order-&gt;amount);\n\n            if (!$result-&gt;isSuccessful()) {\n                throw new PaymentFailedException(\n                    '\u6c7a\u6e08\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f: ' . $result-&gt;getMessage()\n                );\n            }\n\n            return $result;\n\n        } catch (PaymentFailedException $e) {\n            \/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u4f8b\u5916\u51e6\u7406\n            report($e);\n            throw $e;\n\n        } catch (\\Exception $e) {\n            \/\/ \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916\u306e\u51e6\u7406\n            report($e);\n            throw new PaymentFailedException(\n                '\u6c7a\u6e08\u51e6\u7406\u4e2d\u306b\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f',\n                500,\n                $e\n            );\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderController extends Controller\n{\n    public function store(OrderRequest $request)\n    {\n        try {\n            $order = $this-&gt;orderService-&gt;createOrder($request-&gt;validated());\n            $this-&gt;paymentService-&gt;processPayment($order);\n\n            return redirect()\n                -&gt;route('orders.show', $order)\n                -&gt;with('success', '\u6ce8\u6587\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f');\n\n        } catch (PaymentFailedException $e) {\n            return back()\n                -&gt;withInput()\n                -&gt;withErrors(['payment' =&gt; $e-&gt;getMessage()]);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-19\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u4f8b\u5916\u3068HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u9069\u5207\u306b\u9023\u643a\u3055\u305b\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ec\u30b9\u30dd\u30f3\u30b9\u30c8\u30ec\u30a4\u30c8\u306e\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Illuminate\\Http\\Response;\nuse Symfony\\Component\\HttpKernel\\Exception\\HttpException;\n\nclass ApiException extends HttpException\n{\n    public function __construct($message = null, $code = Response::HTTP_BAD_REQUEST)\n    {\n        parent::__construct($code, $message ?? 'API\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f');\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\nprotected $statusCodeMapping = [\n    ModelNotFoundException::class =&gt; 404,\n    AuthorizationException::class =&gt; 403,\n    ValidationException::class =&gt; 422,\n    PaymentFailedException::class =&gt; 400\n];\n\npublic function render($request, Throwable $e)\n{\n    $statusCode = $this-&gt;statusCodeMapping[get_class($e)] ?? 500;\n\n    if ($request-&gt;expectsJson()) {\n        return response()-&gt;json([\n            'error' =&gt; $e-&gt;getMessage(),\n            'status' =&gt; $statusCode\n        ], $statusCode);\n    }\n\n    return parent::render($request, $e);\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u8a2d\u8a08\u3059\u308b<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3092\u7d71\u4e00\u3059\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u8a18\u9332\u3068\u30a8\u30e9\u30fc\u901a\u77e5\u3092\u9069\u5207\u306b\u8a2d\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>API\u3068Web\u753b\u9762\u3067\u9069\u5207\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u3059<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8a2d\u5b9a\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-20\">\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-21\">\u610f\u5473\u306e\u3042\u308b\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u8a08<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u3001\u554f\u984c\u306e\u7279\u5b9a\u3068\u89e3\u6c7a\u3092\u5bb9\u6613\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30c3\u30bb\u30fc\u30b8\u8a2d\u8a08\u306e\u539f\u5247<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderException extends Exception\n{\n    public function __construct($orderId, $reason, $suggestion = null)\n    {\n        $message = sprintf(\n            'Order #%d failed: %s',\n            $orderId,\n            $reason\n        );\n\n        if ($suggestion) {\n            $message .= sprintf('. Suggestion: %s', $suggestion);\n        }\n\n        parent::__construct($message);\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nthrow new OrderException(\n    $order-&gt;id,\n    '\u5728\u5eab\u4e0d\u8db3',\n    '\u5c11\u91cf\u306b\u5206\u3051\u3066\u6ce8\u6587\u3057\u3066\u304f\u3060\u3055\u3044'\n);<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u306e\u4ed8\u52a0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class DataValidationException extends Exception\n{\n    protected $errors;\n\n    public function __construct(array $errors, $message = '\u5165\u529b\u30c7\u30fc\u30bf\u304c\u4e0d\u6b63\u3067\u3059')\n    {\n        $this-&gt;errors = $errors;\n        parent::__construct($message);\n    }\n\n    public function getValidationErrors()\n    {\n        return $this-&gt;errors;\n    }\n\n    public function render($request)\n    {\n        return response()-&gt;json([\n            'message' =&gt; $this-&gt;getMessage(),\n            'errors' =&gt; $this-&gt;getValidationErrors()\n        ], 422);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-22\">\u6b63\u3057\u3044\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30ed\u30b0\u8a18\u9332\u306f\u554f\u984c\u306e\u8ffd\u8de1\u3068\u89e3\u6c7a\u306b\u4e0d\u53ef\u6b20\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u968e\u5c64\u7684\u306a\u30ed\u30b0\u30ec\u30d9\u30eb\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            Log::info('\u6c7a\u6e08\u51e6\u7406\u958b\u59cb', ['order_id' =&gt; $order-&gt;id]);\n\n            $result = $this-&gt;gateway-&gt;charge($order);\n\n            Log::info('\u6c7a\u6e08\u51e6\u7406\u5b8c\u4e86', [\n                'order_id' =&gt; $order-&gt;id,\n                'transaction_id' =&gt; $result-&gt;transaction_id\n            ]);\n\n            return $result;\n\n        } catch (Exception $e) {\n            Log::error('\u6c7a\u6e08\u51e6\u7406\u30a8\u30e9\u30fc', [\n                'order_id' =&gt; $order-&gt;id,\n                'error' =&gt; $e-&gt;getMessage(),\n                'trace' =&gt; $e-&gt;getTraceAsString()\n            ]);\n\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/logging.php\n'channels' =&gt; [\n    'payment' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/payment.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n    'security' =&gt; [\n        'driver' =&gt; 'slack',\n        'url' =&gt; env('LOG_SLACK_WEBHOOK_URL'),\n        'username' =&gt; 'Security Bot',\n        'emoji' =&gt; ':warning:',\n        'level' =&gt; 'critical',\n    ],\n],\n\n\/\/ \u4f7f\u7528\u4f8b\nLog::channel('payment')-&gt;info('\u6c7a\u6e08\u51e6\u7406\u958b\u59cb');\nLog::channel('security')-&gt;critical('\u4e0d\u6b63\u30a2\u30af\u30bb\u30b9\u3092\u691c\u77e5');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u306e\u4f5c\u6210<\/h3>\n\n\n\n<p>\u30a8\u30e9\u30fc\u753b\u9762\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u91cd\u8981\u306a\u90e8\u5206\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30a8\u30e9\u30fc\u30d3\u30e5\u30fc\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ resources\/views\/errors\/500.blade.php\n@extends('layouts.error')\n\n@section('content')\n&lt;div class=\"error-container\"&gt;\n    &lt;h1&gt;\u7533\u3057\u8a33\u3042\u308a\u307e\u305b\u3093&lt;\/h1&gt;\n    &lt;p&gt;{{ $exception-&gt;getMessage() ?: '\u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f' }}&lt;\/p&gt;\n\n    @if(app()-&gt;environment('local'))\n        &lt;div class=\"debug-info\"&gt;\n            &lt;pre&gt;{{ $exception-&gt;getTraceAsString() }}&lt;\/pre&gt;\n        &lt;\/div&gt;\n    @endif\n\n    &lt;div class=\"action-buttons\"&gt;\n        &lt;a href=\"{{ url('\/') }}\" class=\"btn\"&gt;\u30db\u30fc\u30e0\u306b\u623b\u308b&lt;\/a&gt;\n        &lt;button onclick=\"window.history.back()\" class=\"btn\"&gt;\u524d\u306e\u30da\u30fc\u30b8\u306b\u623b\u308b&lt;\/button&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n@endsection<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u306b\u5fdc\u3058\u305f\u30a8\u30e9\u30fc\u8868\u793a\u306e\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\npublic function render($request, Throwable $exception)\n{\n    if ($this-&gt;shouldReturnJson($request, $exception)) {\n        return $this-&gt;renderJsonError($exception);\n    }\n\n    if (app()-&gt;environment('production')) {\n        return $this-&gt;renderProductionError($exception);\n    }\n\n    return parent::render($request, $exception);\n}\n\nprotected function renderJsonError(Throwable $exception)\n{\n    $status = $this-&gt;getHttpStatusCode($exception);\n\n    return response()-&gt;json([\n        'error' =&gt; $this-&gt;getErrorMessage($exception, $status),\n        'status' =&gt; $status\n    ], $status);\n}\n\nprotected function renderProductionError(Throwable $exception)\n{\n    $status = $this-&gt;getHttpStatusCode($exception);\n\n    return response()-&gt;view('errors.custom', [\n        'message' =&gt; $this-&gt;getErrorMessage($exception, $status),\n        'status' =&gt; $status,\n        'help' =&gt; $this-&gt;getHelpText($status)\n    ], $status);\n}<\/pre>\n\n\n\n<p>\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u3067\u884c\u52d5\u53ef\u80fd\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u306f\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u3092\u5341\u5206\u306b\u542b\u3081\u3001\u9069\u5207\u306a\u30ec\u30d9\u30eb\u3067\u8a18\u9332<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306f\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u96a0\u853d<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u3092\u63d0\u4f9b<\/li>\n\n\n\n<li>\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u8868\u793a<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u4f7f\u3044\u3084\u3059\u3044\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-24\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-25\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u975e\u5e38\u306b\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u7279\u306bLaravel\u306e\u3088\u3046\u306a\u672c\u756a\u74b0\u5883\u3067\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u306f\u3001\u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u4ee5\u4e0b\u306e\u7406\u7531\u304b\u3089\u4e0d\u53ef\u6b20\u3068\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4fe1\u983c\u6027\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u3092\u9069\u5207\u306b\u30ad\u30e3\u30c3\u30c1\u3057\u51e6\u7406<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u7dad\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u60c5\u5831\u306e\u6f0f\u6d29\u9632\u6b62<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u3088\u308b\u8106\u5f31\u6027\u9732\u51fa\u306e\u56de\u907f<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ed\u30b0\u8a18\u9332\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u306e\u5b9f\u73fe<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u306e\u52b9\u7387\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u63d0\u4f9b<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-26\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>Laravel\u306eException\u306e\u4ed5\u7d44\u307f\u306f\u3001PHP\u306e\u4f8b\u5916\u51e6\u7406\u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u57fa\u76e4\u3068\u3057\u306a\u304c\u3089\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u56fa\u6709\u306e\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ \u6f5c\u5728\u7684\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c9\n    $result = $this-&gt;someRiskyOperation();\n} catch (Exception $e) {\n    \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n    Log::error('\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: ' . $e-&gt;getMessage());\n    return response()-&gt;json(['error' =&gt; '\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f'], 500);\n} finally {\n    \/\/ \u5fc5\u305a\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\n    $this-&gt;cleanup();\n}<\/pre>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u51e6\u7406\u306e\u6d41\u308c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f8b\u5916\u306e\u767a\u751f<\/li>\n\n\n\n<li>\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u751f\u6210<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-27\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/h3>\n\n\n\n<p>Laravel\u306b\u306f\u69d8\u3005\u306a\u7d44\u307f\u8fbc\u307f\u4f8b\u5916\u30af\u30e9\u30b9\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Exception<\/code>: \u3059\u3079\u3066\u306e\u4f8b\u5916\u306e\u57fa\u5e95\u30af\u30e9\u30b9<\/li>\n\n\n\n<li><code>RuntimeException<\/code>: \u5b9f\u884c\u6642\u306e\u4f8b\u5916<\/li>\n\n\n\n<li><code>LogicException<\/code>: \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30b8\u30c3\u30af\u30a8\u30e9\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Laravel\u56fa\u6709\u306e\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30e2\u30c7\u30eb\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u4f8b\u5916\n   use Illuminate\\Database\\Eloquent\\ModelNotFoundException;\n\n   \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5931\u6557\u6642\u306e\u4f8b\u5916\n   use Illuminate\\Validation\\ValidationException;\n\n   \/\/ \u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u4f8b\u5916\n   use Illuminate\\Auth\\AuthenticationException;\n   use Illuminate\\Auth\\Access\\AuthorizationException;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u968e\u5c64\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   Exception\n   \u251c\u2500\u2500 RuntimeException\n   \u2502   \u251c\u2500\u2500 ModelNotFoundException\n   \u2502   \u2514\u2500\u2500 ValidationException\n   \u2514\u2500\u2500 LogicException\n       \u2514\u2500\u2500 AuthorizationException<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u3001\u305d\u308c\u305e\u308c\u7279\u5b9a\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u304a\u308a\u3001\u9069\u5207\u306aHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3084\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u4f7f\u3044\u5206\u3051\u308b<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306f\u65e2\u5b58\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3066\u4f5c\u6210<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u304b\u3064\u9069\u5207\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u304c\u3001Laravel Exception\u306e\u57fa\u672c\u7684\u306a\u6982\u5ff5\u3068\u4ed5\u7d44\u307f\u3067\u3059\u3002\u3053\u308c\u3089\u306e\u7406\u89e3\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5\u306e\u57fa\u790e\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-28\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-29\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306b\u3001\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace App\\Exceptions;\n\nuse Exception;\n\nclass PaymentFailedException extends Exception\n{\n    protected $message = '\u6c7a\u6e08\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f';\n    protected $code = 500;\n\n    public function report()\n    {\n        \/\/ \u30a8\u30e9\u30fc\u306e\u30ed\u30b0\u8a18\u9332\n        \\Log::error('\u6c7a\u6e08\u30a8\u30e9\u30fc: ' . $this-&gt;getMessage());\n    }\n\n    public function render($request)\n    {\n        \/\/ API\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        if ($request-&gt;expectsJson()) {\n            return response()-&gt;json([\n                'error' =&gt; $this-&gt;getMessage(),\n                'code' =&gt; $this-&gt;code\n            ], $this-&gt;code);\n        }\n\n        \/\/ \u901a\u5e38\u306eWeb\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        return view('errors.payment', [\n            'message' =&gt; $this-&gt;getMessage()\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function __construct($message = null, $code = 0, Exception $previous = null)\n{\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u3042\u308b\u5834\u5408\u306f\u4e0a\u66f8\u304d\n    if (!is_null($message)) {\n        $this-&gt;message = $message;\n    }\n\n    parent::__construct($this-&gt;message, $code, $previous);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d3\u30b9\u30af\u30e9\u30b9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            \/\/ \u6c7a\u6e08\u51e6\u7406\n            $result = $this-&gt;paymentGateway-&gt;charge($order-&gt;amount);\n\n            if (!$result-&gt;isSuccessful()) {\n                throw new PaymentFailedException(\n                    '\u6c7a\u6e08\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f: ' . $result-&gt;getMessage()\n                );\n            }\n\n            return $result;\n\n        } catch (PaymentFailedException $e) {\n            \/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u4f8b\u5916\u51e6\u7406\n            report($e);\n            throw $e;\n\n        } catch (\\Exception $e) {\n            \/\/ \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916\u306e\u51e6\u7406\n            report($e);\n            throw new PaymentFailedException(\n                '\u6c7a\u6e08\u51e6\u7406\u4e2d\u306b\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f',\n                500,\n                $e\n            );\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderController extends Controller\n{\n    public function store(OrderRequest $request)\n    {\n        try {\n            $order = $this-&gt;orderService-&gt;createOrder($request-&gt;validated());\n            $this-&gt;paymentService-&gt;processPayment($order);\n\n            return redirect()\n                -&gt;route('orders.show', $order)\n                -&gt;with('success', '\u6ce8\u6587\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f');\n\n        } catch (PaymentFailedException $e) {\n            return back()\n                -&gt;withInput()\n                -&gt;withErrors(['payment' =&gt; $e-&gt;getMessage()]);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-31\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u4f8b\u5916\u3068HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u9069\u5207\u306b\u9023\u643a\u3055\u305b\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ec\u30b9\u30dd\u30f3\u30b9\u30c8\u30ec\u30a4\u30c8\u306e\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Illuminate\\Http\\Response;\nuse Symfony\\Component\\HttpKernel\\Exception\\HttpException;\n\nclass ApiException extends HttpException\n{\n    public function __construct($message = null, $code = Response::HTTP_BAD_REQUEST)\n    {\n        parent::__construct($code, $message ?? 'API\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f');\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\nprotected $statusCodeMapping = [\n    ModelNotFoundException::class =&gt; 404,\n    AuthorizationException::class =&gt; 403,\n    ValidationException::class =&gt; 422,\n    PaymentFailedException::class =&gt; 400\n];\n\npublic function render($request, Throwable $e)\n{\n    $statusCode = $this-&gt;statusCodeMapping[get_class($e)] ?? 500;\n\n    if ($request-&gt;expectsJson()) {\n        return response()-&gt;json([\n            'error' =&gt; $e-&gt;getMessage(),\n            'status' =&gt; $statusCode\n        ], $statusCode);\n    }\n\n    return parent::render($request, $e);\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u8a2d\u8a08\u3059\u308b<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3092\u7d71\u4e00\u3059\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u8a18\u9332\u3068\u30a8\u30e9\u30fc\u901a\u77e5\u3092\u9069\u5207\u306b\u8a2d\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>API\u3068Web\u753b\u9762\u3067\u9069\u5207\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u3059<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8a2d\u5b9a\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-32\">\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">\u610f\u5473\u306e\u3042\u308b\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u8a08<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u3001\u554f\u984c\u306e\u7279\u5b9a\u3068\u89e3\u6c7a\u3092\u5bb9\u6613\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30c3\u30bb\u30fc\u30b8\u8a2d\u8a08\u306e\u539f\u5247<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderException extends Exception\n{\n    public function __construct($orderId, $reason, $suggestion = null)\n    {\n        $message = sprintf(\n            'Order #%d failed: %s',\n            $orderId,\n            $reason\n        );\n\n        if ($suggestion) {\n            $message .= sprintf('. Suggestion: %s', $suggestion);\n        }\n\n        parent::__construct($message);\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nthrow new OrderException(\n    $order-&gt;id,\n    '\u5728\u5eab\u4e0d\u8db3',\n    '\u5c11\u91cf\u306b\u5206\u3051\u3066\u6ce8\u6587\u3057\u3066\u304f\u3060\u3055\u3044'\n);<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u306e\u4ed8\u52a0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class DataValidationException extends Exception\n{\n    protected $errors;\n\n    public function __construct(array $errors, $message = '\u5165\u529b\u30c7\u30fc\u30bf\u304c\u4e0d\u6b63\u3067\u3059')\n    {\n        $this-&gt;errors = $errors;\n        parent::__construct($message);\n    }\n\n    public function getValidationErrors()\n    {\n        return $this-&gt;errors;\n    }\n\n    public function render($request)\n    {\n        return response()-&gt;json([\n            'message' =&gt; $this-&gt;getMessage(),\n            'errors' =&gt; $this-&gt;getValidationErrors()\n        ], 422);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-34\">\u6b63\u3057\u3044\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30ed\u30b0\u8a18\u9332\u306f\u554f\u984c\u306e\u8ffd\u8de1\u3068\u89e3\u6c7a\u306b\u4e0d\u53ef\u6b20\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u968e\u5c64\u7684\u306a\u30ed\u30b0\u30ec\u30d9\u30eb\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            Log::info('\u6c7a\u6e08\u51e6\u7406\u958b\u59cb', ['order_id' =&gt; $order-&gt;id]);\n\n            $result = $this-&gt;gateway-&gt;charge($order);\n\n            Log::info('\u6c7a\u6e08\u51e6\u7406\u5b8c\u4e86', [\n                'order_id' =&gt; $order-&gt;id,\n                'transaction_id' =&gt; $result-&gt;transaction_id\n            ]);\n\n            return $result;\n\n        } catch (Exception $e) {\n            Log::error('\u6c7a\u6e08\u51e6\u7406\u30a8\u30e9\u30fc', [\n                'order_id' =&gt; $order-&gt;id,\n                'error' =&gt; $e-&gt;getMessage(),\n                'trace' =&gt; $e-&gt;getTraceAsString()\n            ]);\n\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/logging.php\n'channels' =&gt; [\n    'payment' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/payment.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n    'security' =&gt; [\n        'driver' =&gt; 'slack',\n        'url' =&gt; env('LOG_SLACK_WEBHOOK_URL'),\n        'username' =&gt; 'Security Bot',\n        'emoji' =&gt; ':warning:',\n        'level' =&gt; 'critical',\n    ],\n],\n\n\/\/ \u4f7f\u7528\u4f8b\nLog::channel('payment')-&gt;info('\u6c7a\u6e08\u51e6\u7406\u958b\u59cb');\nLog::channel('security')-&gt;critical('\u4e0d\u6b63\u30a2\u30af\u30bb\u30b9\u3092\u691c\u77e5');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-35\">\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u306e\u4f5c\u6210<\/h3>\n\n\n\n<p>\u30a8\u30e9\u30fc\u753b\u9762\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u91cd\u8981\u306a\u90e8\u5206\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30a8\u30e9\u30fc\u30d3\u30e5\u30fc\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ resources\/views\/errors\/500.blade.php\n@extends('layouts.error')\n\n@section('content')\n&lt;div class=\"error-container\"&gt;\n    &lt;h1&gt;\u7533\u3057\u8a33\u3042\u308a\u307e\u305b\u3093&lt;\/h1&gt;\n    &lt;p&gt;{{ $exception-&gt;getMessage() ?: '\u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f' }}&lt;\/p&gt;\n\n    @if(app()-&gt;environment('local'))\n        &lt;div class=\"debug-info\"&gt;\n            &lt;pre&gt;{{ $exception-&gt;getTraceAsString() }}&lt;\/pre&gt;\n        &lt;\/div&gt;\n    @endif\n\n    &lt;div class=\"action-buttons\"&gt;\n        &lt;a href=\"{{ url('\/') }}\" class=\"btn\"&gt;\u30db\u30fc\u30e0\u306b\u623b\u308b&lt;\/a&gt;\n        &lt;button onclick=\"window.history.back()\" class=\"btn\"&gt;\u524d\u306e\u30da\u30fc\u30b8\u306b\u623b\u308b&lt;\/button&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n@endsection<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u306b\u5fdc\u3058\u305f\u30a8\u30e9\u30fc\u8868\u793a\u306e\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\npublic function render($request, Throwable $exception)\n{\n    if ($this-&gt;shouldReturnJson($request, $exception)) {\n        return $this-&gt;renderJsonError($exception);\n    }\n\n    if (app()-&gt;environment('production')) {\n        return $this-&gt;renderProductionError($exception);\n    }\n\n    return parent::render($request, $exception);\n}\n\nprotected function renderJsonError(Throwable $exception)\n{\n    $status = $this-&gt;getHttpStatusCode($exception);\n\n    return response()-&gt;json([\n        'error' =&gt; $this-&gt;getErrorMessage($exception, $status),\n        'status' =&gt; $status\n    ], $status);\n}\n\nprotected function renderProductionError(Throwable $exception)\n{\n    $status = $this-&gt;getHttpStatusCode($exception);\n\n    return response()-&gt;view('errors.custom', [\n        'message' =&gt; $this-&gt;getErrorMessage($exception, $status),\n        'status' =&gt; $status,\n        'help' =&gt; $this-&gt;getHelpText($status)\n    ], $status);\n}<\/pre>\n\n\n\n<p>\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u3067\u884c\u52d5\u53ef\u80fd\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u306f\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u3092\u5341\u5206\u306b\u542b\u3081\u3001\u9069\u5207\u306a\u30ec\u30d9\u30eb\u3067\u8a18\u9332<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306f\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u96a0\u853d<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u3092\u63d0\u4f9b<\/li>\n\n\n\n<li>\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u8868\u793a<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u4f7f\u3044\u3084\u3059\u3044\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-36\">\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u624b\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-37\">\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u6d3b\u7528<\/h3>\n\n\n\n<p>Laravel\u306e\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5168\u4f53\u3067\u4e00\u8cab\u3057\u305f\u30a8\u30e9\u30fc\u51e6\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\nnamespace App\\Exceptions;\n\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\nuse Throwable;\n\nclass Handler extends ExceptionHandler\n{\n    protected $dontReport = [\n        \\App\\Exceptions\\MinorException::class,\n    ];\n\n    public function register(): void\n    {\n        $this-&gt;reportable(function (\\App\\Exceptions\\CustomException $e) {\n            \/\/ \u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306e\u5831\u544a\u30ed\u30b8\u30c3\u30af\n            if (app()-&gt;bound('sentry')) {\n                app('sentry')-&gt;captureException($e);\n            }\n        });\n\n        $this-&gt;renderable(function (\\App\\Exceptions\\ApiException $e, $request) {\n            \/\/ API\u4f8b\u5916\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u30ed\u30b8\u30c3\u30af\n            return response()-&gt;json([\n                'error' =&gt; $e-&gt;getMessage(),\n                'code' =&gt; $e-&gt;getCode()\n            ], $e-&gt;getStatusCode());\n        });\n    }\n\n    protected function shouldReturnJson($request, Throwable $e): bool\n    {\n        return $request-&gt;expectsJson() || \n               $request-&gt;is('api\/*') || \n               $e instanceof ApiException;\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30de\u30af\u30ed\u3092\u4f7f\u7528\u3057\u305f\u62e1\u5f35<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Providers\/AppServiceProvider.php\nuse Illuminate\\Support\\ServiceProvider;\nuse Illuminate\\Support\\Facades\\Response;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    public function boot()\n    {\n        Response::macro('error', function ($message, $code = 400) {\n            return response()-&gt;json([\n                'error' =&gt; $message,\n                'status' =&gt; $code\n            ], $code);\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-38\">API\u306e\u30a8\u30e9\u30fc\u5bfe\u5fdc\u8a2d\u8a08<\/h3>\n\n\n\n<p>RESTful API\u306b\u304a\u3051\u308b\u52b9\u679c\u7684\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>API\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u6a19\u6e96\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ApiResponse\n{\n    public static function error($message, $errors = [], $code = 400)\n    {\n        return response()-&gt;json([\n            'status' =&gt; 'error',\n            'message' =&gt; $message,\n            'errors' =&gt; $errors,\n            'timestamp' =&gt; now()-&gt;toIso8601String(),\n            'request_id' =&gt; request()-&gt;id()\n        ], $code);\n    }\n\n    public static function exception(Throwable $e)\n    {\n        $debug = config('app.debug') ? [\n            'exception' =&gt; get_class($e),\n            'file' =&gt; $e-&gt;getFile(),\n            'line' =&gt; $e-&gt;getLine(),\n            'trace' =&gt; collect($e-&gt;getTrace())-&gt;take(3)\n        ] : null;\n\n        return response()-&gt;json([\n            'status' =&gt; 'error',\n            'message' =&gt; $e-&gt;getMessage(),\n            'code' =&gt; $e-&gt;getCode(),\n            'debug' =&gt; $debug\n        ], 500);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ec\u30fc\u30c8\u5236\u9650\u3068\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ routes\/api.php\nRoute::middleware(['auth:api', 'throttle:60,1'])-&gt;group(function () {\n    Route::get('\/users', function () {\n        try {\n            \/\/ \u30e6\u30fc\u30b6\u30fc\u53d6\u5f97\u30ed\u30b8\u30c3\u30af\n        } catch (Throwable $e) {\n            return ApiResponse::exception($e);\n        }\n    })-&gt;withoutMiddleware(['throttle']); \/\/ \u7279\u5b9a\u30eb\u30fc\u30c8\u3067\u5236\u9650\u89e3\u9664\n});\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30ec\u30fc\u30c8\u5236\u9650\u30cf\u30f3\u30c9\u30e9\u30fc\nRateLimiter::handleException(function ($e) {\n    return ApiResponse::error('Too Many Requests', [], 429);\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-39\">\u975e\u540c\u671f\u51e6\u7406\u306b\u304a\u3051\u308b\u4f8b\u5916\u51e6\u7406<\/h3>\n\n\n\n<p>\u30ad\u30e5\u30fc\u3084\u30b8\u30e7\u30d6\u3067\u306e\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b8\u30e7\u30d6\u30af\u30e9\u30b9\u3067\u306e\u4f8b\u5916\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProcessPayment implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    public $tries = 3;\n    public $maxExceptions = 2;\n    public $timeout = 120;\n\n    public function handle()\n    {\n        try {\n            \/\/ \u652f\u6255\u3044\u51e6\u7406\u30ed\u30b8\u30c3\u30af\n        } catch (PaymentException $e) {\n            $this-&gt;fail($e);\n        }\n    }\n\n    public function failed(Throwable $e)\n    {\n        \/\/ \u5931\u6557\u6642\u306e\u901a\u77e5\n        Notification::route('slack', config('services.slack.webhook'))\n            -&gt;notify(new PaymentFailedNotification($e));\n    }\n\n    public function retryUntil()\n    {\n        return now()-&gt;addMinutes(30);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u975e\u540c\u671f\u51e6\u7406\u306e\u30a8\u30e9\u30fc\u76e3\u8996<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5931\u6557\u3057\u305f\u30b8\u30e7\u30d6\u306e\u76e3\u8996\nQueue::failing(function (JobFailed $event) {\n    $job = $event-&gt;job;\n    $exception = $event-&gt;exception;\n\n    Log::error('\u30b8\u30e7\u30d6\u5931\u6557', [\n        'job' =&gt; get_class($job),\n        'queue' =&gt; $job-&gt;getQueue(),\n        'error' =&gt; $exception-&gt;getMessage(),\n        'trace' =&gt; $exception-&gt;getTraceAsString()\n    ]);\n\n    \/\/ \u91cd\u5927\u306a\u30a8\u30e9\u30fc\u306e\u5834\u5408\u306f\u5373\u6642\u901a\u77e5\n    if ($exception instanceof CriticalException) {\n        Notification::route('slack', config('services.slack.webhook'))\n            -&gt;notify(new CriticalErrorNotification($exception));\n    }\n});\n\n\/\/ \u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u76e3\u8996\nQueue::looping(function () {\n    \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\n    if (memory_get_usage() &gt; 100 * 1024 * 1024) {\n        return false; \/\/ \u30ef\u30fc\u30ab\u30fc\u306e\u518d\u8d77\u52d5\n    }\n});<\/pre>\n\n\n\n<p>\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b0\u30ed\u30fc\u30d0\u30eb\u30cf\u30f3\u30c9\u30e9\u30fc\u3067\u4e00\u8cab\u6027\u306e\u3042\u308b\u51e6\u7406\u3092\u5b9f\u73fe<\/li>\n\n\n\n<li>API\u30ec\u30b9\u30dd\u30f3\u30b9\u306f\u6a19\u6e96\u5316\u3057\u3066\u6271\u3044\u3084\u3059\u304f<\/li>\n\n\n\n<li>\u975e\u540c\u671f\u51e6\u7406\u3067\u306f\u518d\u8a66\u884c\u6226\u7565\u3092\u9069\u5207\u306b\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u76e3\u8996\u3068\u901a\u77e5\u306e\u4ed5\u7d44\u307f\u3092\u6574\u5099<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u3092\u8003\u616e<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306f\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u5236\u5fa1<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u9ad8\u5ea6\u306a\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-40\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-41\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u975e\u5e38\u306b\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u7279\u306bLaravel\u306e\u3088\u3046\u306a\u672c\u756a\u74b0\u5883\u3067\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u306f\u3001\u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u4ee5\u4e0b\u306e\u7406\u7531\u304b\u3089\u4e0d\u53ef\u6b20\u3068\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4fe1\u983c\u6027\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u3092\u9069\u5207\u306b\u30ad\u30e3\u30c3\u30c1\u3057\u51e6\u7406<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u7dad\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u60c5\u5831\u306e\u6f0f\u6d29\u9632\u6b62<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u3088\u308b\u8106\u5f31\u6027\u9732\u51fa\u306e\u56de\u907f<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ed\u30b0\u8a18\u9332\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u306e\u5b9f\u73fe<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u306e\u52b9\u7387\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u63d0\u4f9b<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-42\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>Laravel\u306eException\u306e\u4ed5\u7d44\u307f\u306f\u3001PHP\u306e\u4f8b\u5916\u51e6\u7406\u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u57fa\u76e4\u3068\u3057\u306a\u304c\u3089\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u56fa\u6709\u306e\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ \u6f5c\u5728\u7684\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c9\n    $result = $this-&gt;someRiskyOperation();\n} catch (Exception $e) {\n    \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n    Log::error('\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: ' . $e-&gt;getMessage());\n    return response()-&gt;json(['error' =&gt; '\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f'], 500);\n} finally {\n    \/\/ \u5fc5\u305a\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\n    $this-&gt;cleanup();\n}<\/pre>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u51e6\u7406\u306e\u6d41\u308c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f8b\u5916\u306e\u767a\u751f<\/li>\n\n\n\n<li>\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u751f\u6210<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-43\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/h3>\n\n\n\n<p>Laravel\u306b\u306f\u69d8\u3005\u306a\u7d44\u307f\u8fbc\u307f\u4f8b\u5916\u30af\u30e9\u30b9\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Exception<\/code>: \u3059\u3079\u3066\u306e\u4f8b\u5916\u306e\u57fa\u5e95\u30af\u30e9\u30b9<\/li>\n\n\n\n<li><code>RuntimeException<\/code>: \u5b9f\u884c\u6642\u306e\u4f8b\u5916<\/li>\n\n\n\n<li><code>LogicException<\/code>: \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30b8\u30c3\u30af\u30a8\u30e9\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Laravel\u56fa\u6709\u306e\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30e2\u30c7\u30eb\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u4f8b\u5916\n   use Illuminate\\Database\\Eloquent\\ModelNotFoundException;\n\n   \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5931\u6557\u6642\u306e\u4f8b\u5916\n   use Illuminate\\Validation\\ValidationException;\n\n   \/\/ \u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u4f8b\u5916\n   use Illuminate\\Auth\\AuthenticationException;\n   use Illuminate\\Auth\\Access\\AuthorizationException;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u968e\u5c64\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   Exception\n   \u251c\u2500\u2500 RuntimeException\n   \u2502   \u251c\u2500\u2500 ModelNotFoundException\n   \u2502   \u2514\u2500\u2500 ValidationException\n   \u2514\u2500\u2500 LogicException\n       \u2514\u2500\u2500 AuthorizationException<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u3001\u305d\u308c\u305e\u308c\u7279\u5b9a\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u304a\u308a\u3001\u9069\u5207\u306aHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3084\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u4f7f\u3044\u5206\u3051\u308b<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306f\u65e2\u5b58\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3066\u4f5c\u6210<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u304b\u3064\u9069\u5207\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u304c\u3001Laravel Exception\u306e\u57fa\u672c\u7684\u306a\u6982\u5ff5\u3068\u4ed5\u7d44\u307f\u3067\u3059\u3002\u3053\u308c\u3089\u306e\u7406\u89e3\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5\u306e\u57fa\u790e\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-44\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-45\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306b\u3001\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace App\\Exceptions;\n\nuse Exception;\n\nclass PaymentFailedException extends Exception\n{\n    protected $message = '\u6c7a\u6e08\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f';\n    protected $code = 500;\n\n    public function report()\n    {\n        \/\/ \u30a8\u30e9\u30fc\u306e\u30ed\u30b0\u8a18\u9332\n        \\Log::error('\u6c7a\u6e08\u30a8\u30e9\u30fc: ' . $this-&gt;getMessage());\n    }\n\n    public function render($request)\n    {\n        \/\/ API\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        if ($request-&gt;expectsJson()) {\n            return response()-&gt;json([\n                'error' =&gt; $this-&gt;getMessage(),\n                'code' =&gt; $this-&gt;code\n            ], $this-&gt;code);\n        }\n\n        \/\/ \u901a\u5e38\u306eWeb\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        return view('errors.payment', [\n            'message' =&gt; $this-&gt;getMessage()\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function __construct($message = null, $code = 0, Exception $previous = null)\n{\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u3042\u308b\u5834\u5408\u306f\u4e0a\u66f8\u304d\n    if (!is_null($message)) {\n        $this-&gt;message = $message;\n    }\n\n    parent::__construct($this-&gt;message, $code, $previous);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-46\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d3\u30b9\u30af\u30e9\u30b9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            \/\/ \u6c7a\u6e08\u51e6\u7406\n            $result = $this-&gt;paymentGateway-&gt;charge($order-&gt;amount);\n\n            if (!$result-&gt;isSuccessful()) {\n                throw new PaymentFailedException(\n                    '\u6c7a\u6e08\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f: ' . $result-&gt;getMessage()\n                );\n            }\n\n            return $result;\n\n        } catch (PaymentFailedException $e) {\n            \/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u4f8b\u5916\u51e6\u7406\n            report($e);\n            throw $e;\n\n        } catch (\\Exception $e) {\n            \/\/ \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916\u306e\u51e6\u7406\n            report($e);\n            throw new PaymentFailedException(\n                '\u6c7a\u6e08\u51e6\u7406\u4e2d\u306b\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f',\n                500,\n                $e\n            );\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderController extends Controller\n{\n    public function store(OrderRequest $request)\n    {\n        try {\n            $order = $this-&gt;orderService-&gt;createOrder($request-&gt;validated());\n            $this-&gt;paymentService-&gt;processPayment($order);\n\n            return redirect()\n                -&gt;route('orders.show', $order)\n                -&gt;with('success', '\u6ce8\u6587\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f');\n\n        } catch (PaymentFailedException $e) {\n            return back()\n                -&gt;withInput()\n                -&gt;withErrors(['payment' =&gt; $e-&gt;getMessage()]);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-47\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u4f8b\u5916\u3068HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u9069\u5207\u306b\u9023\u643a\u3055\u305b\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ec\u30b9\u30dd\u30f3\u30b9\u30c8\u30ec\u30a4\u30c8\u306e\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Illuminate\\Http\\Response;\nuse Symfony\\Component\\HttpKernel\\Exception\\HttpException;\n\nclass ApiException extends HttpException\n{\n    public function __construct($message = null, $code = Response::HTTP_BAD_REQUEST)\n    {\n        parent::__construct($code, $message ?? 'API\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f');\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\nprotected $statusCodeMapping = [\n    ModelNotFoundException::class =&gt; 404,\n    AuthorizationException::class =&gt; 403,\n    ValidationException::class =&gt; 422,\n    PaymentFailedException::class =&gt; 400\n];\n\npublic function render($request, Throwable $e)\n{\n    $statusCode = $this-&gt;statusCodeMapping[get_class($e)] ?? 500;\n\n    if ($request-&gt;expectsJson()) {\n        return response()-&gt;json([\n            'error' =&gt; $e-&gt;getMessage(),\n            'status' =&gt; $statusCode\n        ], $statusCode);\n    }\n\n    return parent::render($request, $e);\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u8a2d\u8a08\u3059\u308b<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3092\u7d71\u4e00\u3059\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u8a18\u9332\u3068\u30a8\u30e9\u30fc\u901a\u77e5\u3092\u9069\u5207\u306b\u8a2d\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>API\u3068Web\u753b\u9762\u3067\u9069\u5207\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u3059<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8a2d\u5b9a\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-48\">\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-49\">\u610f\u5473\u306e\u3042\u308b\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u8a08<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u3001\u554f\u984c\u306e\u7279\u5b9a\u3068\u89e3\u6c7a\u3092\u5bb9\u6613\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30c3\u30bb\u30fc\u30b8\u8a2d\u8a08\u306e\u539f\u5247<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderException extends Exception\n{\n    public function __construct($orderId, $reason, $suggestion = null)\n    {\n        $message = sprintf(\n            'Order #%d failed: %s',\n            $orderId,\n            $reason\n        );\n\n        if ($suggestion) {\n            $message .= sprintf('. Suggestion: %s', $suggestion);\n        }\n\n        parent::__construct($message);\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nthrow new OrderException(\n    $order-&gt;id,\n    '\u5728\u5eab\u4e0d\u8db3',\n    '\u5c11\u91cf\u306b\u5206\u3051\u3066\u6ce8\u6587\u3057\u3066\u304f\u3060\u3055\u3044'\n);<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u306e\u4ed8\u52a0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class DataValidationException extends Exception\n{\n    protected $errors;\n\n    public function __construct(array $errors, $message = '\u5165\u529b\u30c7\u30fc\u30bf\u304c\u4e0d\u6b63\u3067\u3059')\n    {\n        $this-&gt;errors = $errors;\n        parent::__construct($message);\n    }\n\n    public function getValidationErrors()\n    {\n        return $this-&gt;errors;\n    }\n\n    public function render($request)\n    {\n        return response()-&gt;json([\n            'message' =&gt; $this-&gt;getMessage(),\n            'errors' =&gt; $this-&gt;getValidationErrors()\n        ], 422);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-50\">\u6b63\u3057\u3044\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30ed\u30b0\u8a18\u9332\u306f\u554f\u984c\u306e\u8ffd\u8de1\u3068\u89e3\u6c7a\u306b\u4e0d\u53ef\u6b20\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u968e\u5c64\u7684\u306a\u30ed\u30b0\u30ec\u30d9\u30eb\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            Log::info('\u6c7a\u6e08\u51e6\u7406\u958b\u59cb', ['order_id' =&gt; $order-&gt;id]);\n\n            $result = $this-&gt;gateway-&gt;charge($order);\n\n            Log::info('\u6c7a\u6e08\u51e6\u7406\u5b8c\u4e86', [\n                'order_id' =&gt; $order-&gt;id,\n                'transaction_id' =&gt; $result-&gt;transaction_id\n            ]);\n\n            return $result;\n\n        } catch (Exception $e) {\n            Log::error('\u6c7a\u6e08\u51e6\u7406\u30a8\u30e9\u30fc', [\n                'order_id' =&gt; $order-&gt;id,\n                'error' =&gt; $e-&gt;getMessage(),\n                'trace' =&gt; $e-&gt;getTraceAsString()\n            ]);\n\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/logging.php\n'channels' =&gt; [\n    'payment' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/payment.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n    'security' =&gt; [\n        'driver' =&gt; 'slack',\n        'url' =&gt; env('LOG_SLACK_WEBHOOK_URL'),\n        'username' =&gt; 'Security Bot',\n        'emoji' =&gt; ':warning:',\n        'level' =&gt; 'critical',\n    ],\n],\n\n\/\/ \u4f7f\u7528\u4f8b\nLog::channel('payment')-&gt;info('\u6c7a\u6e08\u51e6\u7406\u958b\u59cb');\nLog::channel('security')-&gt;critical('\u4e0d\u6b63\u30a2\u30af\u30bb\u30b9\u3092\u691c\u77e5');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-51\">\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u306e\u4f5c\u6210<\/h3>\n\n\n\n<p>\u30a8\u30e9\u30fc\u753b\u9762\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u91cd\u8981\u306a\u90e8\u5206\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30a8\u30e9\u30fc\u30d3\u30e5\u30fc\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ resources\/views\/errors\/500.blade.php\n@extends('layouts.error')\n\n@section('content')\n&lt;div class=\"error-container\"&gt;\n    &lt;h1&gt;\u7533\u3057\u8a33\u3042\u308a\u307e\u305b\u3093&lt;\/h1&gt;\n    &lt;p&gt;{{ $exception-&gt;getMessage() ?: '\u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f' }}&lt;\/p&gt;\n\n    @if(app()-&gt;environment('local'))\n        &lt;div class=\"debug-info\"&gt;\n            &lt;pre&gt;{{ $exception-&gt;getTraceAsString() }}&lt;\/pre&gt;\n        &lt;\/div&gt;\n    @endif\n\n    &lt;div class=\"action-buttons\"&gt;\n        &lt;a href=\"{{ url('\/') }}\" class=\"btn\"&gt;\u30db\u30fc\u30e0\u306b\u623b\u308b&lt;\/a&gt;\n        &lt;button onclick=\"window.history.back()\" class=\"btn\"&gt;\u524d\u306e\u30da\u30fc\u30b8\u306b\u623b\u308b&lt;\/button&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n@endsection<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u306b\u5fdc\u3058\u305f\u30a8\u30e9\u30fc\u8868\u793a\u306e\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\npublic function render($request, Throwable $exception)\n{\n    if ($this-&gt;shouldReturnJson($request, $exception)) {\n        return $this-&gt;renderJsonError($exception);\n    }\n\n    if (app()-&gt;environment('production')) {\n        return $this-&gt;renderProductionError($exception);\n    }\n\n    return parent::render($request, $exception);\n}\n\nprotected function renderJsonError(Throwable $exception)\n{\n    $status = $this-&gt;getHttpStatusCode($exception);\n\n    return response()-&gt;json([\n        'error' =&gt; $this-&gt;getErrorMessage($exception, $status),\n        'status' =&gt; $status\n    ], $status);\n}\n\nprotected function renderProductionError(Throwable $exception)\n{\n    $status = $this-&gt;getHttpStatusCode($exception);\n\n    return response()-&gt;view('errors.custom', [\n        'message' =&gt; $this-&gt;getErrorMessage($exception, $status),\n        'status' =&gt; $status,\n        'help' =&gt; $this-&gt;getHelpText($status)\n    ], $status);\n}<\/pre>\n\n\n\n<p>\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u3067\u884c\u52d5\u53ef\u80fd\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u306f\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u3092\u5341\u5206\u306b\u542b\u3081\u3001\u9069\u5207\u306a\u30ec\u30d9\u30eb\u3067\u8a18\u9332<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306f\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u96a0\u853d<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u3092\u63d0\u4f9b<\/li>\n\n\n\n<li>\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u8868\u793a<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u4f7f\u3044\u3084\u3059\u3044\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-52\">\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u624b\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-53\">\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u6d3b\u7528<\/h3>\n\n\n\n<p>Laravel\u306e\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5168\u4f53\u3067\u4e00\u8cab\u3057\u305f\u30a8\u30e9\u30fc\u51e6\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\nnamespace App\\Exceptions;\n\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\nuse Throwable;\n\nclass Handler extends ExceptionHandler\n{\n    protected $dontReport = [\n        \\App\\Exceptions\\MinorException::class,\n    ];\n\n    public function register(): void\n    {\n        $this-&gt;reportable(function (\\App\\Exceptions\\CustomException $e) {\n            \/\/ \u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306e\u5831\u544a\u30ed\u30b8\u30c3\u30af\n            if (app()-&gt;bound('sentry')) {\n                app('sentry')-&gt;captureException($e);\n            }\n        });\n\n        $this-&gt;renderable(function (\\App\\Exceptions\\ApiException $e, $request) {\n            \/\/ API\u4f8b\u5916\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u30ed\u30b8\u30c3\u30af\n            return response()-&gt;json([\n                'error' =&gt; $e-&gt;getMessage(),\n                'code' =&gt; $e-&gt;getCode()\n            ], $e-&gt;getStatusCode());\n        });\n    }\n\n    protected function shouldReturnJson($request, Throwable $e): bool\n    {\n        return $request-&gt;expectsJson() || \n               $request-&gt;is('api\/*') || \n               $e instanceof ApiException;\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30de\u30af\u30ed\u3092\u4f7f\u7528\u3057\u305f\u62e1\u5f35<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Providers\/AppServiceProvider.php\nuse Illuminate\\Support\\ServiceProvider;\nuse Illuminate\\Support\\Facades\\Response;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    public function boot()\n    {\n        Response::macro('error', function ($message, $code = 400) {\n            return response()-&gt;json([\n                'error' =&gt; $message,\n                'status' =&gt; $code\n            ], $code);\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-54\">API\u306e\u30a8\u30e9\u30fc\u5bfe\u5fdc\u8a2d\u8a08<\/h3>\n\n\n\n<p>RESTful API\u306b\u304a\u3051\u308b\u52b9\u679c\u7684\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>API\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u6a19\u6e96\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ApiResponse\n{\n    public static function error($message, $errors = [], $code = 400)\n    {\n        return response()-&gt;json([\n            'status' =&gt; 'error',\n            'message' =&gt; $message,\n            'errors' =&gt; $errors,\n            'timestamp' =&gt; now()-&gt;toIso8601String(),\n            'request_id' =&gt; request()-&gt;id()\n        ], $code);\n    }\n\n    public static function exception(Throwable $e)\n    {\n        $debug = config('app.debug') ? [\n            'exception' =&gt; get_class($e),\n            'file' =&gt; $e-&gt;getFile(),\n            'line' =&gt; $e-&gt;getLine(),\n            'trace' =&gt; collect($e-&gt;getTrace())-&gt;take(3)\n        ] : null;\n\n        return response()-&gt;json([\n            'status' =&gt; 'error',\n            'message' =&gt; $e-&gt;getMessage(),\n            'code' =&gt; $e-&gt;getCode(),\n            'debug' =&gt; $debug\n        ], 500);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ec\u30fc\u30c8\u5236\u9650\u3068\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ routes\/api.php\nRoute::middleware(['auth:api', 'throttle:60,1'])-&gt;group(function () {\n    Route::get('\/users', function () {\n        try {\n            \/\/ \u30e6\u30fc\u30b6\u30fc\u53d6\u5f97\u30ed\u30b8\u30c3\u30af\n        } catch (Throwable $e) {\n            return ApiResponse::exception($e);\n        }\n    })-&gt;withoutMiddleware(['throttle']); \/\/ \u7279\u5b9a\u30eb\u30fc\u30c8\u3067\u5236\u9650\u89e3\u9664\n});\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30ec\u30fc\u30c8\u5236\u9650\u30cf\u30f3\u30c9\u30e9\u30fc\nRateLimiter::handleException(function ($e) {\n    return ApiResponse::error('Too Many Requests', [], 429);\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-55\">\u975e\u540c\u671f\u51e6\u7406\u306b\u304a\u3051\u308b\u4f8b\u5916\u51e6\u7406<\/h3>\n\n\n\n<p>\u30ad\u30e5\u30fc\u3084\u30b8\u30e7\u30d6\u3067\u306e\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b8\u30e7\u30d6\u30af\u30e9\u30b9\u3067\u306e\u4f8b\u5916\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProcessPayment implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    public $tries = 3;\n    public $maxExceptions = 2;\n    public $timeout = 120;\n\n    public function handle()\n    {\n        try {\n            \/\/ \u652f\u6255\u3044\u51e6\u7406\u30ed\u30b8\u30c3\u30af\n        } catch (PaymentException $e) {\n            $this-&gt;fail($e);\n        }\n    }\n\n    public function failed(Throwable $e)\n    {\n        \/\/ \u5931\u6557\u6642\u306e\u901a\u77e5\n        Notification::route('slack', config('services.slack.webhook'))\n            -&gt;notify(new PaymentFailedNotification($e));\n    }\n\n    public function retryUntil()\n    {\n        return now()-&gt;addMinutes(30);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u975e\u540c\u671f\u51e6\u7406\u306e\u30a8\u30e9\u30fc\u76e3\u8996<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5931\u6557\u3057\u305f\u30b8\u30e7\u30d6\u306e\u76e3\u8996\nQueue::failing(function (JobFailed $event) {\n    $job = $event-&gt;job;\n    $exception = $event-&gt;exception;\n\n    Log::error('\u30b8\u30e7\u30d6\u5931\u6557', [\n        'job' =&gt; get_class($job),\n        'queue' =&gt; $job-&gt;getQueue(),\n        'error' =&gt; $exception-&gt;getMessage(),\n        'trace' =&gt; $exception-&gt;getTraceAsString()\n    ]);\n\n    \/\/ \u91cd\u5927\u306a\u30a8\u30e9\u30fc\u306e\u5834\u5408\u306f\u5373\u6642\u901a\u77e5\n    if ($exception instanceof CriticalException) {\n        Notification::route('slack', config('services.slack.webhook'))\n            -&gt;notify(new CriticalErrorNotification($exception));\n    }\n});\n\n\/\/ \u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u76e3\u8996\nQueue::looping(function () {\n    \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\n    if (memory_get_usage() &gt; 100 * 1024 * 1024) {\n        return false; \/\/ \u30ef\u30fc\u30ab\u30fc\u306e\u518d\u8d77\u52d5\n    }\n});<\/pre>\n\n\n\n<p>\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b0\u30ed\u30fc\u30d0\u30eb\u30cf\u30f3\u30c9\u30e9\u30fc\u3067\u4e00\u8cab\u6027\u306e\u3042\u308b\u51e6\u7406\u3092\u5b9f\u73fe<\/li>\n\n\n\n<li>API\u30ec\u30b9\u30dd\u30f3\u30b9\u306f\u6a19\u6e96\u5316\u3057\u3066\u6271\u3044\u3084\u3059\u304f<\/li>\n\n\n\n<li>\u975e\u540c\u671f\u51e6\u7406\u3067\u306f\u518d\u8a66\u884c\u6226\u7565\u3092\u9069\u5207\u306b\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u76e3\u8996\u3068\u901a\u77e5\u306e\u4ed5\u7d44\u307f\u3092\u6574\u5099<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u3092\u8003\u616e<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306f\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u5236\u5fa1<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u9ad8\u5ea6\u306a\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-56\">\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-57\">\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/h3>\n\n\n\n<p>Laravel\u306b\u304a\u3051\u308b\u52b9\u679c\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u30c4\u30fc\u30eb\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c7\u30d0\u30c3\u30b0\u30d0\u30fc\u306e\u8a2d\u5b9a\n\/\/ config\/debugbar.php\nreturn [\n    'enabled' =&gt; env('DEBUGBAR_ENABLED', false),\n    'collectors' =&gt; [\n        'phpinfo' =&gt; true,\n        'messages' =&gt; true,\n        'time' =&gt; true,\n        'memory' =&gt; true,\n        'exceptions' =&gt; true,\n        'log' =&gt; true,\n        'db' =&gt; true,\n        'views' =&gt; true,\n        'route' =&gt; true,\n        'cache' =&gt; true,\n    ],\n];\n\n\/\/ \u4f7f\u7528\u4f8b\n\\Debugbar::info('\u30c7\u30d0\u30c3\u30b0\u60c5\u5831');\n\\Debugbar::error('\u30a8\u30e9\u30fc\u60c5\u5831');\n\\Debugbar::startMeasure('operation', '\u51e6\u7406\u306e\u8a08\u6e2c');\n\\Debugbar::stopMeasure('operation');<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u30c7\u30d0\u30c3\u30b0\u88dc\u52a9\u30e1\u30bd\u30c3\u30c9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class CustomException extends Exception\n{\n    public function context()\n    {\n        return [\n            'request_id' =&gt; request()-&gt;id(),\n            'user_id' =&gt; auth()-&gt;id(),\n            'url' =&gt; request()-&gt;fullUrl(),\n            'input' =&gt; request()-&gt;except(['password']),\n            'headers' =&gt; request()-&gt;headers-&gt;all(),\n            'session' =&gt; session()-&gt;all()\n        ];\n    }\n\n    public function getDebugData()\n    {\n        if (!app()-&gt;isLocal()) {\n            return null;\n        }\n\n        return [\n            'file' =&gt; $this-&gt;getFile(),\n            'line' =&gt; $this-&gt;getLine(),\n            'trace' =&gt; $this-&gt;getTraceAsString(),\n            'previous' =&gt; $this-&gt;getPrevious() ? [\n                'message' =&gt; $this-&gt;getPrevious()-&gt;getMessage(),\n                'class' =&gt; get_class($this-&gt;getPrevious())\n            ] : null\n        ];\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-58\">\u4e00\u822c\u7684\u306a\u4f8b\u5916\u30d1\u30bf\u30fc\u30f3\u3068\u89e3\u6c7a\u7b56<\/h3>\n\n\n\n<p>\u3088\u304f\u3042\u308b\u4f8b\u5916\u30d1\u30bf\u30fc\u30f3\u3068\u305d\u306e\u5bfe\u51e6\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u95a2\u9023\u306e\u4f8b\u5916<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    $user = User::findOrFail($id);\n} catch (ModelNotFoundException $e) {\n    Log::error('\u30e6\u30fc\u30b6\u30fc\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093', [\n        'id' =&gt; $id,\n        'trace' =&gt; $e-&gt;getTraceAsString()\n    ]);\n\n    return $this-&gt;handleModelNotFound($e);\n}\n\nprotected function handleModelNotFound($e)\n{\n    if (request()-&gt;expectsJson()) {\n        return response()-&gt;json([\n            'error' =&gt; '\u30ea\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093',\n            'details' =&gt; [\n                'model' =&gt; class_basename($e-&gt;getModel()),\n                'id' =&gt; $e-&gt;getIds()\n            ]\n        ], 404);\n    }\n\n    return redirect()-&gt;back()\n        -&gt;withErrors(['message' =&gt; '\u30ea\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093']);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8a8d\u8a3c\/\u8a8d\u53ef\u306e\u4f8b\u5916<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class AuthExceptionHandler\n{\n    public function handle($e)\n    {\n        if ($e instanceof AuthenticationException) {\n            return $this-&gt;handleUnauthenticated($e);\n        }\n\n        if ($e instanceof AuthorizationException) {\n            return $this-&gt;handleUnauthorized($e);\n        }\n\n        return null;\n    }\n\n    protected function handleUnauthenticated($e)\n    {\n        Log::warning('\u672a\u8a8d\u8a3c\u30a2\u30af\u30bb\u30b9', [\n            'ip' =&gt; request()-&gt;ip(),\n            'url' =&gt; request()-&gt;fullUrl()\n        ]);\n\n        return response()-&gt;json([\n            'error' =&gt; '\u8a8d\u8a3c\u304c\u5fc5\u8981\u3067\u3059',\n            'login_url' =&gt; route('login')\n        ], 401);\n    }\n\n    protected function handleUnauthorized($e)\n    {\n        Log::warning('\u4e0d\u6b63\u306a\u30a2\u30af\u30bb\u30b9\u8a66\u884c', [\n            'user' =&gt; auth()-&gt;user()-&gt;id,\n            'action' =&gt; request()-&gt;route()-&gt;getName()\n        ]);\n\n        return response()-&gt;json([\n            'error' =&gt; '\u30a2\u30af\u30bb\u30b9\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093'\n        ], 403);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-59\">\u672c\u756a\u74b0\u5883\u3067\u306e\u4f8b\u5916\u76e3\u8996\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u672c\u756a\u74b0\u5883\u306b\u304a\u3051\u308b\u52b9\u679c\u7684\u306a\u4f8b\u5916\u76e3\u8996\u306e\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Providers\/AppServiceProvider.php\npublic function boot()\n{\n    \/\/ Sentry\u306e\u7d71\u5408\n    if (app()-&gt;bound('sentry')) {\n        $this-&gt;app-&gt;make('sentry')-&gt;beforeSend(function ($event) {\n            if (app()-&gt;environment('production')) {\n                \/\/ \u6a5f\u5bc6\u60c5\u5831\u306e\u524a\u9664\n                unset($event['request']['cookies']);\n                unset($event['request']['headers']['authorization']);\n            }\n            return $event;\n        });\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\ntry {\n    \/\/ \u5371\u967a\u306a\u64cd\u4f5c\n} catch (Exception $e) {\n    if (app()-&gt;bound('sentry')) {\n        app('sentry')-&gt;captureException($e);\n    }\n    throw $e;\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ExceptionMonitor\n{\n    protected $threshold = 10;\n    protected $timeWindow = 300; \/\/ 5\u5206\n\n    public function handleException($e)\n    {\n        $key = $this-&gt;getExceptionKey($e);\n\n        \/\/ Redis\u3092\u4f7f\u7528\u3057\u305f\u4f8b\u5916\u767a\u751f\u56de\u6570\u306e\u8ffd\u8de1\n        $count = Redis::incr($key);\n        Redis::expire($key, $this-&gt;timeWindow);\n\n        if ($count &gt;= $this-&gt;threshold) {\n            $this-&gt;notifyHighFrequencyException($e, $count);\n            Redis::del($key);\n        }\n    }\n\n    protected function getExceptionKey($e)\n    {\n        return 'exception:' . get_class($e) . ':' . date('YmdHi');\n    }\n\n    protected function notifyHighFrequencyException($e, $count)\n    {\n        Notification::route('slack', config('services.slack.webhook'))\n            -&gt;notify(new HighFrequencyExceptionNotification($e, $count));\n    }\n}<\/pre>\n\n\n\n<p>\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30d0\u30c3\u30b0\u30c4\u30fc\u30eb\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u3092\u5341\u5206\u306b\u53ce\u96c6\u3059\u308b<\/li>\n\n\n\n<li>\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u3092\u63d0\u4f9b\u3059\u308b<\/li>\n\n\n\n<li>\u4e00\u822c\u7684\u306a\u4f8b\u5916\u30d1\u30bf\u30fc\u30f3\u306b\u5bfe\u3059\u308b\u6a19\u6e96\u7684\u306a\u5bfe\u51e6\u65b9\u6cd5\u3092\u7528\u610f<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u76e3\u8996\u4f53\u5236\u3092\u6574\u5099\u3059\u308b<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u60c5\u5831\u53ce\u96c6\u3092\u884c\u3046<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u624b\u6cd5\u3092\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u3068\u554f\u984c\u89e3\u6c7a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-60\">Laravel Exception \u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-61\">Laravel \u306b\u304a\u3051\u308b\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u91cd\u8981\u6027<\/h3>\n\n\n\n<p>Web\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u304a\u3044\u3066\u3001\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u975e\u5e38\u306b\u91cd\u8981\u306a\u8981\u7d20\u3067\u3059\u3002\u7279\u306bLaravel\u306e\u3088\u3046\u306a\u672c\u756a\u74b0\u5883\u3067\u4f7f\u7528\u3055\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3067\u306f\u3001\u9069\u5207\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306f\u4ee5\u4e0b\u306e\u7406\u7531\u304b\u3089\u4e0d\u53ef\u6b20\u3068\u306a\u308a\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4fe1\u983c\u6027\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u3092\u9069\u5207\u306b\u30ad\u30e3\u30c3\u30c1\u3057\u51e6\u7406<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u5b89\u5b9a\u6027\u3092\u78ba\u4fdd<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u7dad\u6301<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30f3\u30b7\u30c6\u30a3\u30d6\u306a\u60c5\u5831\u306e\u6f0f\u6d29\u9632\u6b62<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306b\u3088\u308b\u8106\u5f31\u6027\u9732\u51fa\u306e\u56de\u907f<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ed\u30b0\u8a18\u9332\u306b\u3088\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u76e3\u67fb\u306e\u5b9f\u73fe<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u306e\u52b9\u7387\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u958b\u767a\u74b0\u5883\u3067\u306e\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u63d0\u4f9b<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u9069\u5207\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u554f\u984c\u306e\u65e9\u671f\u767a\u898b\u3068\u89e3\u6c7a<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-62\">\u4f8b\u5916\u51e6\u7406\u306e\u57fa\u672c\u7684\u306a\u4ed5\u7d44\u307f<\/h3>\n\n\n\n<p>Laravel\u306eException\u306e\u4ed5\u7d44\u307f\u306f\u3001PHP\u306e\u4f8b\u5916\u51e6\u7406\u30e1\u30ab\u30cb\u30ba\u30e0\u3092\u57fa\u76e4\u3068\u3057\u306a\u304c\u3089\u3001\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u56fa\u6709\u306e\u6a5f\u80fd\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ \u6f5c\u5728\u7684\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3059\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u30b3\u30fc\u30c9\n    $result = $this-&gt;someRiskyOperation();\n} catch (Exception $e) {\n    \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\n    Log::error('\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: ' . $e-&gt;getMessage());\n    return response()-&gt;json(['error' =&gt; '\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f'], 500);\n} finally {\n    \/\/ \u5fc5\u305a\u5b9f\u884c\u3055\u308c\u308b\u51e6\u7406\n    $this-&gt;cleanup();\n}<\/pre>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u51e6\u7406\u306e\u6d41\u308c\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u4f8b\u5916\u306e\u767a\u751f<\/li>\n\n\n\n<li>\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u751f\u6210<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-63\">\u307e\u3055\u304b\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3068\u969c\u5bb3\u69cb\u9020<\/h3>\n\n\n\n<p>Laravel\u306b\u306f\u69d8\u3005\u306a\u7d44\u307f\u8fbc\u307f\u4f8b\u5916\u30af\u30e9\u30b9\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Exception<\/code>: \u3059\u3079\u3066\u306e\u4f8b\u5916\u306e\u57fa\u5e95\u30af\u30e9\u30b9<\/li>\n\n\n\n<li><code>RuntimeException<\/code>: \u5b9f\u884c\u6642\u306e\u4f8b\u5916<\/li>\n\n\n\n<li><code>LogicException<\/code>: \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30ed\u30b8\u30c3\u30af\u30a8\u30e9\u30fc<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Laravel\u56fa\u6709\u306e\u4f8b\u5916\u30af\u30e9\u30b9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30e2\u30c7\u30eb\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u5834\u5408\u306e\u4f8b\u5916\n   use Illuminate\\Database\\Eloquent\\ModelNotFoundException;\n\n   \/\/ \u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u5931\u6557\u6642\u306e\u4f8b\u5916\n   use Illuminate\\Validation\\ValidationException;\n\n   \/\/ \u8a8d\u8a3c\u30fb\u8a8d\u53ef\u306e\u4f8b\u5916\n   use Illuminate\\Auth\\AuthenticationException;\n   use Illuminate\\Auth\\Access\\AuthorizationException;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u968e\u5c64\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   Exception\n   \u251c\u2500\u2500 RuntimeException\n   \u2502   \u251c\u2500\u2500 ModelNotFoundException\n   \u2502   \u2514\u2500\u2500 ValidationException\n   \u2514\u2500\u2500 LogicException\n       \u2514\u2500\u2500 AuthorizationException<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u3001\u305d\u308c\u305e\u308c\u7279\u5b9a\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u304a\u308a\u3001\u9069\u5207\u306aHTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3084\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u6301\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u4f7f\u3044\u5206\u3051\u308b<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306f\u65e2\u5b58\u306e\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u7d99\u627f\u3057\u3066\u4f5c\u6210<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u304b\u3064\u9069\u5207\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u4ee5\u4e0a\u304c\u3001Laravel Exception\u306e\u57fa\u672c\u7684\u306a\u6982\u5ff5\u3068\u4ed5\u7d44\u307f\u3067\u3059\u3002\u3053\u308c\u3089\u306e\u7406\u89e3\u306f\u3001\u3088\u308a\u9ad8\u5ea6\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5\u306e\u57fa\u790e\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-64\">Laravel Exception \u306e\u5b9f\u8df5\u7684\u306a\u4f7f\u3044\u65b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-65\">\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u30a8\u30e9\u30fc\u72b6\u6cc1\u306b\u5bfe\u5fdc\u3059\u308b\u305f\u3081\u306b\u3001\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30af\u30e9\u30b9\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;?php\n\nnamespace App\\Exceptions;\n\nuse Exception;\n\nclass PaymentFailedException extends Exception\n{\n    protected $message = '\u6c7a\u6e08\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f';\n    protected $code = 500;\n\n    public function report()\n    {\n        \/\/ \u30a8\u30e9\u30fc\u306e\u30ed\u30b0\u8a18\u9332\n        \\Log::error('\u6c7a\u6e08\u30a8\u30e9\u30fc: ' . $this-&gt;getMessage());\n    }\n\n    public function render($request)\n    {\n        \/\/ API\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        if ($request-&gt;expectsJson()) {\n            return response()-&gt;json([\n                'error' =&gt; $this-&gt;getMessage(),\n                'code' =&gt; $this-&gt;code\n            ], $this-&gt;code);\n        }\n\n        \/\/ \u901a\u5e38\u306eWeb\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5834\u5408\u306e\u30ec\u30b9\u30dd\u30f3\u30b9\n        return view('errors.payment', [\n            'message' =&gt; $this-&gt;getMessage()\n        ]);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30b9\u30c8\u30e9\u30af\u30bf\u3067\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public function __construct($message = null, $code = 0, Exception $previous = null)\n{\n    \/\/ \u30ab\u30b9\u30bf\u30e0\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u3042\u308b\u5834\u5408\u306f\u4e0a\u66f8\u304d\n    if (!is_null($message)) {\n        $this-&gt;message = $message;\n    }\n\n    parent::__construct($this-&gt;message, $code, $previous);\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-66\">\u4f8b\u5916\u306e\u30ad\u30e3\u30c3\u30c1\u3068\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b<\/h3>\n\n\n\n<p>\u5b9f\u969b\u306e\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u306e\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5\u4f8b\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d3\u30b9\u30af\u30e9\u30b9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            \/\/ \u6c7a\u6e08\u51e6\u7406\n            $result = $this-&gt;paymentGateway-&gt;charge($order-&gt;amount);\n\n            if (!$result-&gt;isSuccessful()) {\n                throw new PaymentFailedException(\n                    '\u6c7a\u6e08\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f: ' . $result-&gt;getMessage()\n                );\n            }\n\n            return $result;\n\n        } catch (PaymentFailedException $e) {\n            \/\/ \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u56fa\u6709\u306e\u4f8b\u5916\u51e6\u7406\n            report($e);\n            throw $e;\n\n        } catch (\\Exception $e) {\n            \/\/ \u305d\u306e\u4ed6\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916\u306e\u51e6\u7406\n            report($e);\n            throw new PaymentFailedException(\n                '\u6c7a\u6e08\u51e6\u7406\u4e2d\u306b\u4e88\u671f\u305b\u306c\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f',\n                500,\n                $e\n            );\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3067\u306e\u4f7f\u7528\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderController extends Controller\n{\n    public function store(OrderRequest $request)\n    {\n        try {\n            $order = $this-&gt;orderService-&gt;createOrder($request-&gt;validated());\n            $this-&gt;paymentService-&gt;processPayment($order);\n\n            return redirect()\n                -&gt;route('orders.show', $order)\n                -&gt;with('success', '\u6ce8\u6587\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f');\n\n        } catch (PaymentFailedException $e) {\n            return back()\n                -&gt;withInput()\n                -&gt;withErrors(['payment' =&gt; $e-&gt;getMessage()]);\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-67\">HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3068\u306e\u9023\u643a\u65b9\u6cd5<\/h3>\n\n\n\n<p>Laravel\u3067\u306f\u3001\u4f8b\u5916\u3068HTTP\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u3092\u9069\u5207\u306b\u9023\u643a\u3055\u305b\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ec\u30b9\u30dd\u30f3\u30b9\u30c8\u30ec\u30a4\u30c8\u306e\u4f7f\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Illuminate\\Http\\Response;\nuse Symfony\\Component\\HttpKernel\\Exception\\HttpException;\n\nclass ApiException extends HttpException\n{\n    public function __construct($message = null, $code = Response::HTTP_BAD_REQUEST)\n    {\n        parent::__construct($code, $message ?? 'API\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f');\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b9\u30c6\u30fc\u30bf\u30b9\u30b3\u30fc\u30c9\u306e\u30de\u30c3\u30d4\u30f3\u30b0\u4f8b<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\nprotected $statusCodeMapping = [\n    ModelNotFoundException::class =&gt; 404,\n    AuthorizationException::class =&gt; 403,\n    ValidationException::class =&gt; 422,\n    PaymentFailedException::class =&gt; 400\n];\n\npublic function render($request, Throwable $e)\n{\n    $statusCode = $this-&gt;statusCodeMapping[get_class($e)] ?? 500;\n\n    if ($request-&gt;expectsJson()) {\n        return response()-&gt;json([\n            'error' =&gt; $e-&gt;getMessage(),\n            'status' =&gt; $statusCode\n        ], $statusCode);\n    }\n\n    return parent::render($request, $e);\n}<\/pre>\n\n\n\n<p>\u5b9f\u88c5\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30af\u30e9\u30b9\u306f\u76ee\u7684\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u8a2d\u8a08\u3059\u308b<\/li>\n\n\n\n<li>\u30ec\u30b9\u30dd\u30f3\u30b9\u30d5\u30a9\u30fc\u30de\u30c3\u30c8\u3092\u7d71\u4e00\u3059\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u8a18\u9332\u3068\u30a8\u30e9\u30fc\u901a\u77e5\u3092\u9069\u5207\u306b\u8a2d\u5b9a\u3059\u308b<\/li>\n\n\n\n<li>API\u3068Web\u753b\u9762\u3067\u9069\u5207\u306a\u30ec\u30b9\u30dd\u30f3\u30b9\u3092\u8fd4\u3059<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u8a2d\u5b9a\u3059\u308b<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u7406\u89e3\u3057\u3001\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u306a\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-68\">\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-69\">\u610f\u5473\u306e\u3042\u308b\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u8a2d\u8a08<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u3001\u554f\u984c\u306e\u7279\u5b9a\u3068\u89e3\u6c7a\u3092\u5bb9\u6613\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30c3\u30bb\u30fc\u30b8\u8a2d\u8a08\u306e\u539f\u5247<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderException extends Exception\n{\n    public function __construct($orderId, $reason, $suggestion = null)\n    {\n        $message = sprintf(\n            'Order #%d failed: %s',\n            $orderId,\n            $reason\n        );\n\n        if ($suggestion) {\n            $message .= sprintf('. Suggestion: %s', $suggestion);\n        }\n\n        parent::__construct($message);\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\nthrow new OrderException(\n    $order-&gt;id,\n    '\u5728\u5eab\u4e0d\u8db3',\n    '\u5c11\u91cf\u306b\u5206\u3051\u3066\u6ce8\u6587\u3057\u3066\u304f\u3060\u3055\u3044'\n);<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u306e\u4ed8\u52a0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class DataValidationException extends Exception\n{\n    protected $errors;\n\n    public function __construct(array $errors, $message = '\u5165\u529b\u30c7\u30fc\u30bf\u304c\u4e0d\u6b63\u3067\u3059')\n    {\n        $this-&gt;errors = $errors;\n        parent::__construct($message);\n    }\n\n    public function getValidationErrors()\n    {\n        return $this-&gt;errors;\n    }\n\n    public function render($request)\n    {\n        return response()-&gt;json([\n            'message' =&gt; $this-&gt;getMessage(),\n            'errors' =&gt; $this-&gt;getValidationErrors()\n        ], 422);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-70\">\u6b63\u3057\u3044\u30ed\u30b0\u8a18\u9332\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u52b9\u679c\u7684\u306a\u30ed\u30b0\u8a18\u9332\u306f\u554f\u984c\u306e\u8ffd\u8de1\u3068\u89e3\u6c7a\u306b\u4e0d\u53ef\u6b20\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u968e\u5c64\u7684\u306a\u30ed\u30b0\u30ec\u30d9\u30eb\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentService\n{\n    public function processPayment(Order $order)\n    {\n        try {\n            Log::info('\u6c7a\u6e08\u51e6\u7406\u958b\u59cb', ['order_id' =&gt; $order-&gt;id]);\n\n            $result = $this-&gt;gateway-&gt;charge($order);\n\n            Log::info('\u6c7a\u6e08\u51e6\u7406\u5b8c\u4e86', [\n                'order_id' =&gt; $order-&gt;id,\n                'transaction_id' =&gt; $result-&gt;transaction_id\n            ]);\n\n            return $result;\n\n        } catch (Exception $e) {\n            Log::error('\u6c7a\u6e08\u51e6\u7406\u30a8\u30e9\u30fc', [\n                'order_id' =&gt; $order-&gt;id,\n                'error' =&gt; $e-&gt;getMessage(),\n                'trace' =&gt; $e-&gt;getTraceAsString()\n            ]);\n\n            throw $e;\n        }\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30ed\u30b0\u30c1\u30e3\u30f3\u30cd\u30eb\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ config\/logging.php\n'channels' =&gt; [\n    'payment' =&gt; [\n        'driver' =&gt; 'daily',\n        'path' =&gt; storage_path('logs\/payment.log'),\n        'level' =&gt; 'debug',\n        'days' =&gt; 14,\n    ],\n    'security' =&gt; [\n        'driver' =&gt; 'slack',\n        'url' =&gt; env('LOG_SLACK_WEBHOOK_URL'),\n        'username' =&gt; 'Security Bot',\n        'emoji' =&gt; ':warning:',\n        'level' =&gt; 'critical',\n    ],\n],\n\n\/\/ \u4f7f\u7528\u4f8b\nLog::channel('payment')-&gt;info('\u6c7a\u6e08\u51e6\u7406\u958b\u59cb');\nLog::channel('security')-&gt;critical('\u4e0d\u6b63\u30a2\u30af\u30bb\u30b9\u3092\u691c\u77e5');<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-71\">\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u306e\u4f5c\u6210<\/h3>\n\n\n\n<p>\u30a8\u30e9\u30fc\u753b\u9762\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u4f53\u9a13\u306e\u91cd\u8981\u306a\u90e8\u5206\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30a8\u30e9\u30fc\u30d3\u30e5\u30fc\u306e\u4f5c\u6210<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ resources\/views\/errors\/500.blade.php\n@extends('layouts.error')\n\n@section('content')\n&lt;div class=\"error-container\"&gt;\n    &lt;h1&gt;\u7533\u3057\u8a33\u3042\u308a\u307e\u305b\u3093&lt;\/h1&gt;\n    &lt;p&gt;{{ $exception-&gt;getMessage() ?: '\u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f' }}&lt;\/p&gt;\n\n    @if(app()-&gt;environment('local'))\n        &lt;div class=\"debug-info\"&gt;\n            &lt;pre&gt;{{ $exception-&gt;getTraceAsString() }}&lt;\/pre&gt;\n        &lt;\/div&gt;\n    @endif\n\n    &lt;div class=\"action-buttons\"&gt;\n        &lt;a href=\"{{ url('\/') }}\" class=\"btn\"&gt;\u30db\u30fc\u30e0\u306b\u623b\u308b&lt;\/a&gt;\n        &lt;button onclick=\"window.history.back()\" class=\"btn\"&gt;\u524d\u306e\u30da\u30fc\u30b8\u306b\u623b\u308b&lt;\/button&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;\n@endsection<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u74b0\u5883\u306b\u5fdc\u3058\u305f\u30a8\u30e9\u30fc\u8868\u793a\u306e\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\npublic function render($request, Throwable $exception)\n{\n    if ($this-&gt;shouldReturnJson($request, $exception)) {\n        return $this-&gt;renderJsonError($exception);\n    }\n\n    if (app()-&gt;environment('production')) {\n        return $this-&gt;renderProductionError($exception);\n    }\n\n    return parent::render($request, $exception);\n}\n\nprotected function renderJsonError(Throwable $exception)\n{\n    $status = $this-&gt;getHttpStatusCode($exception);\n\n    return response()-&gt;json([\n        'error' =&gt; $this-&gt;getErrorMessage($exception, $status),\n        'status' =&gt; $status\n    ], $status);\n}\n\nprotected function renderProductionError(Throwable $exception)\n{\n    $status = $this-&gt;getHttpStatusCode($exception);\n\n    return response()-&gt;view('errors.custom', [\n        'message' =&gt; $this-&gt;getErrorMessage($exception, $status),\n        'status' =&gt; $status,\n        'help' =&gt; $this-&gt;getHelpText($status)\n    ], $status);\n}<\/pre>\n\n\n\n<p>\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8\u306f\u5177\u4f53\u7684\u3067\u884c\u52d5\u53ef\u80fd\u306a\u60c5\u5831\u3092\u542b\u3081\u308b<\/li>\n\n\n\n<li>\u30ed\u30b0\u306f\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u3092\u5341\u5206\u306b\u542b\u3081\u3001\u9069\u5207\u306a\u30ec\u30d9\u30eb\u3067\u8a18\u9332<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306f\u8a73\u7d30\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u96a0\u853d<\/li>\n\n\n\n<li>\u30e6\u30fc\u30b6\u30fc\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u30a8\u30e9\u30fc\u753b\u9762\u3092\u63d0\u4f9b<\/li>\n\n\n\n<li>\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30a8\u30e9\u30fc\u60c5\u5831\u3092\u8868\u793a<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u3092\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u5b89\u5168\u3067\u4f7f\u3044\u3084\u3059\u3044\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-72\">\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u624b\u6cd5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-73\">\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u6d3b\u7528<\/h3>\n\n\n\n<p>Laravel\u306e\u30b0\u30ed\u30fc\u30d0\u30eb\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u3092\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u5168\u4f53\u3067\u4e00\u8cab\u3057\u305f\u30a8\u30e9\u30fc\u51e6\u7406\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Exceptions\/Handler.php\nnamespace App\\Exceptions;\n\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\nuse Throwable;\n\nclass Handler extends ExceptionHandler\n{\n    protected $dontReport = [\n        \\App\\Exceptions\\MinorException::class,\n    ];\n\n    public function register(): void\n    {\n        $this-&gt;reportable(function (\\App\\Exceptions\\CustomException $e) {\n            \/\/ \u30ab\u30b9\u30bf\u30e0\u4f8b\u5916\u306e\u5831\u544a\u30ed\u30b8\u30c3\u30af\n            if (app()-&gt;bound('sentry')) {\n                app('sentry')-&gt;captureException($e);\n            }\n        });\n\n        $this-&gt;renderable(function (\\App\\Exceptions\\ApiException $e, $request) {\n            \/\/ API\u4f8b\u5916\u306e\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0\u30ed\u30b8\u30c3\u30af\n            return response()-&gt;json([\n                'error' =&gt; $e-&gt;getMessage(),\n                'code' =&gt; $e-&gt;getCode()\n            ], $e-&gt;getStatusCode());\n        });\n    }\n\n    protected function shouldReturnJson($request, Throwable $e): bool\n    {\n        return $request-&gt;expectsJson() || \n               $request-&gt;is('api\/*') || \n               $e instanceof ApiException;\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30de\u30af\u30ed\u3092\u4f7f\u7528\u3057\u305f\u62e1\u5f35<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Providers\/AppServiceProvider.php\nuse Illuminate\\Support\\ServiceProvider;\nuse Illuminate\\Support\\Facades\\Response;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    public function boot()\n    {\n        Response::macro('error', function ($message, $code = 400) {\n            return response()-&gt;json([\n                'error' =&gt; $message,\n                'status' =&gt; $code\n            ], $code);\n        });\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-74\">API\u306e\u30a8\u30e9\u30fc\u5bfe\u5fdc\u8a2d\u8a08<\/h3>\n\n\n\n<p>RESTful API\u306b\u304a\u3051\u308b\u52b9\u679c\u7684\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>API\u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u6a19\u6e96\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ApiResponse\n{\n    public static function error($message, $errors = [], $code = 400)\n    {\n        return response()-&gt;json([\n            'status' =&gt; 'error',\n            'message' =&gt; $message,\n            'errors' =&gt; $errors,\n            'timestamp' =&gt; now()-&gt;toIso8601String(),\n            'request_id' =&gt; request()-&gt;id()\n        ], $code);\n    }\n\n    public static function exception(Throwable $e)\n    {\n        $debug = config('app.debug') ? [\n            'exception' =&gt; get_class($e),\n            'file' =&gt; $e-&gt;getFile(),\n            'line' =&gt; $e-&gt;getLine(),\n            'trace' =&gt; collect($e-&gt;getTrace())-&gt;take(3)\n        ] : null;\n\n        return response()-&gt;json([\n            'status' =&gt; 'error',\n            'message' =&gt; $e-&gt;getMessage(),\n            'code' =&gt; $e-&gt;getCode(),\n            'debug' =&gt; $debug\n        ], 500);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ec\u30fc\u30c8\u5236\u9650\u3068\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ routes\/api.php\nRoute::middleware(['auth:api', 'throttle:60,1'])-&gt;group(function () {\n    Route::get('\/users', function () {\n        try {\n            \/\/ \u30e6\u30fc\u30b6\u30fc\u53d6\u5f97\u30ed\u30b8\u30c3\u30af\n        } catch (Throwable $e) {\n            return ApiResponse::exception($e);\n        }\n    })-&gt;withoutMiddleware(['throttle']); \/\/ \u7279\u5b9a\u30eb\u30fc\u30c8\u3067\u5236\u9650\u89e3\u9664\n});\n\n\/\/ \u30ab\u30b9\u30bf\u30e0\u30ec\u30fc\u30c8\u5236\u9650\u30cf\u30f3\u30c9\u30e9\u30fc\nRateLimiter::handleException(function ($e) {\n    return ApiResponse::error('Too Many Requests', [], 429);\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-75\">\u975e\u540c\u671f\u51e6\u7406\u306b\u304a\u3051\u308b\u4f8b\u5916\u51e6\u7406<\/h3>\n\n\n\n<p>\u30ad\u30e5\u30fc\u3084\u30b8\u30e7\u30d6\u3067\u306e\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b8\u30e7\u30d6\u30af\u30e9\u30b9\u3067\u306e\u4f8b\u5916\u51e6\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ProcessPayment implements ShouldQueue\n{\n    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;\n\n    public $tries = 3;\n    public $maxExceptions = 2;\n    public $timeout = 120;\n\n    public function handle()\n    {\n        try {\n            \/\/ \u652f\u6255\u3044\u51e6\u7406\u30ed\u30b8\u30c3\u30af\n        } catch (PaymentException $e) {\n            $this-&gt;fail($e);\n        }\n    }\n\n    public function failed(Throwable $e)\n    {\n        \/\/ \u5931\u6557\u6642\u306e\u901a\u77e5\n        Notification::route('slack', config('services.slack.webhook'))\n            -&gt;notify(new PaymentFailedNotification($e));\n    }\n\n    public function retryUntil()\n    {\n        return now()-&gt;addMinutes(30);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u975e\u540c\u671f\u51e6\u7406\u306e\u30a8\u30e9\u30fc\u76e3\u8996<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u5931\u6557\u3057\u305f\u30b8\u30e7\u30d6\u306e\u76e3\u8996\nQueue::failing(function (JobFailed $event) {\n    $job = $event-&gt;job;\n    $exception = $event-&gt;exception;\n\n    Log::error('\u30b8\u30e7\u30d6\u5931\u6557', [\n        'job' =&gt; get_class($job),\n        'queue' =&gt; $job-&gt;getQueue(),\n        'error' =&gt; $exception-&gt;getMessage(),\n        'trace' =&gt; $exception-&gt;getTraceAsString()\n    ]);\n\n    \/\/ \u91cd\u5927\u306a\u30a8\u30e9\u30fc\u306e\u5834\u5408\u306f\u5373\u6642\u901a\u77e5\n    if ($exception instanceof CriticalException) {\n        Notification::route('slack', config('services.slack.webhook'))\n            -&gt;notify(new CriticalErrorNotification($exception));\n    }\n});\n\n\/\/ \u30ad\u30e5\u30fc\u30ef\u30fc\u30ab\u30fc\u306e\u76e3\u8996\nQueue::looping(function () {\n    \/\/ \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996\n    if (memory_get_usage() &gt; 100 * 1024 * 1024) {\n        return false; \/\/ \u30ef\u30fc\u30ab\u30fc\u306e\u518d\u8d77\u52d5\n    }\n});<\/pre>\n\n\n\n<p>\u9ad8\u5ea6\u306a\u4f8b\u5916\u51e6\u7406\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b0\u30ed\u30fc\u30d0\u30eb\u30cf\u30f3\u30c9\u30e9\u30fc\u3067\u4e00\u8cab\u6027\u306e\u3042\u308b\u51e6\u7406\u3092\u5b9f\u73fe<\/li>\n\n\n\n<li>API\u30ec\u30b9\u30dd\u30f3\u30b9\u306f\u6a19\u6e96\u5316\u3057\u3066\u6271\u3044\u3084\u3059\u304f<\/li>\n\n\n\n<li>\u975e\u540c\u671f\u51e6\u7406\u3067\u306f\u518d\u8a66\u884c\u6226\u7565\u3092\u9069\u5207\u306b\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u76e3\u8996\u3068\u901a\u77e5\u306e\u4ed5\u7d44\u307f\u3092\u6574\u5099<\/li>\n\n\n\n<li>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3068\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u3092\u8003\u616e<\/li>\n\n\n\n<li>\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u306f\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306b\u5236\u5fa1<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u9ad8\u5ea6\u306a\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5805\u7262\u3067\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u30a8\u30e9\u30fc\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-76\">\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-77\">\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u624b\u6cd5<\/h3>\n\n\n\n<p>Laravel\u306b\u304a\u3051\u308b\u52b9\u679c\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30d0\u30c3\u30b0\u30c4\u30fc\u30eb\u306e\u6d3b\u7528<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30c7\u30d0\u30c3\u30b0\u30d0\u30fc\u306e\u8a2d\u5b9a\n\/\/ config\/debugbar.php\nreturn [\n    'enabled' =&gt; env('DEBUGBAR_ENABLED', false),\n    'collectors' =&gt; [\n        'phpinfo' =&gt; true,\n        'messages' =&gt; true,\n        'time' =&gt; true,\n        'memory' =&gt; true,\n        'exceptions' =&gt; true,\n        'log' =&gt; true,\n        'db' =&gt; true,\n        'views' =&gt; true,\n        'route' =&gt; true,\n        'cache' =&gt; true,\n    ],\n];\n\n\/\/ \u4f7f\u7528\u4f8b\n\\Debugbar::info('\u30c7\u30d0\u30c3\u30b0\u60c5\u5831');\n\\Debugbar::error('\u30a8\u30e9\u30fc\u60c5\u5831');\n\\Debugbar::startMeasure('operation', '\u51e6\u7406\u306e\u8a08\u6e2c');\n\\Debugbar::stopMeasure('operation');<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u30c7\u30d0\u30c3\u30b0\u88dc\u52a9\u30e1\u30bd\u30c3\u30c9<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class CustomException extends Exception\n{\n    public function context()\n    {\n        return [\n            'request_id' =&gt; request()-&gt;id(),\n            'user_id' =&gt; auth()-&gt;id(),\n            'url' =&gt; request()-&gt;fullUrl(),\n            'input' =&gt; request()-&gt;except(['password']),\n            'headers' =&gt; request()-&gt;headers-&gt;all(),\n            'session' =&gt; session()-&gt;all()\n        ];\n    }\n\n    public function getDebugData()\n    {\n        if (!app()-&gt;isLocal()) {\n            return null;\n        }\n\n        return [\n            'file' =&gt; $this-&gt;getFile(),\n            'line' =&gt; $this-&gt;getLine(),\n            'trace' =&gt; $this-&gt;getTraceAsString(),\n            'previous' =&gt; $this-&gt;getPrevious() ? [\n                'message' =&gt; $this-&gt;getPrevious()-&gt;getMessage(),\n                'class' =&gt; get_class($this-&gt;getPrevious())\n            ] : null\n        ];\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-78\">\u4e00\u822c\u7684\u306a\u4f8b\u5916\u30d1\u30bf\u30fc\u30f3\u3068\u89e3\u6c7a\u7b56<\/h3>\n\n\n\n<p>\u3088\u304f\u3042\u308b\u4f8b\u5916\u30d1\u30bf\u30fc\u30f3\u3068\u305d\u306e\u5bfe\u51e6\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u95a2\u9023\u306e\u4f8b\u5916<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    $user = User::findOrFail($id);\n} catch (ModelNotFoundException $e) {\n    Log::error('\u30e6\u30fc\u30b6\u30fc\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093', [\n        'id' =&gt; $id,\n        'trace' =&gt; $e-&gt;getTraceAsString()\n    ]);\n\n    return $this-&gt;handleModelNotFound($e);\n}\n\nprotected function handleModelNotFound($e)\n{\n    if (request()-&gt;expectsJson()) {\n        return response()-&gt;json([\n            'error' =&gt; '\u30ea\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093',\n            'details' =&gt; [\n                'model' =&gt; class_basename($e-&gt;getModel()),\n                'id' =&gt; $e-&gt;getIds()\n            ]\n        ], 404);\n    }\n\n    return redirect()-&gt;back()\n        -&gt;withErrors(['message' =&gt; '\u30ea\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093']);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8a8d\u8a3c\/\u8a8d\u53ef\u306e\u4f8b\u5916<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class AuthExceptionHandler\n{\n    public function handle($e)\n    {\n        if ($e instanceof AuthenticationException) {\n            return $this-&gt;handleUnauthenticated($e);\n        }\n\n        if ($e instanceof AuthorizationException) {\n            return $this-&gt;handleUnauthorized($e);\n        }\n\n        return null;\n    }\n\n    protected function handleUnauthenticated($e)\n    {\n        Log::warning('\u672a\u8a8d\u8a3c\u30a2\u30af\u30bb\u30b9', [\n            'ip' =&gt; request()-&gt;ip(),\n            'url' =&gt; request()-&gt;fullUrl()\n        ]);\n\n        return response()-&gt;json([\n            'error' =&gt; '\u8a8d\u8a3c\u304c\u5fc5\u8981\u3067\u3059',\n            'login_url' =&gt; route('login')\n        ], 401);\n    }\n\n    protected function handleUnauthorized($e)\n    {\n        Log::warning('\u4e0d\u6b63\u306a\u30a2\u30af\u30bb\u30b9\u8a66\u884c', [\n            'user' =&gt; auth()-&gt;user()-&gt;id,\n            'action' =&gt; request()-&gt;route()-&gt;getName()\n        ]);\n\n        return response()-&gt;json([\n            'error' =&gt; '\u30a2\u30af\u30bb\u30b9\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093'\n        ], 403);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-79\">\u672c\u756a\u74b0\u5883\u3067\u306e\u4f8b\u5916\u76e3\u8996\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u672c\u756a\u74b0\u5883\u306b\u304a\u3051\u308b\u52b9\u679c\u7684\u306a\u4f8b\u5916\u76e3\u8996\u306e\u5b9f\u88c5\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ app\/Providers\/AppServiceProvider.php\npublic function boot()\n{\n    \/\/ Sentry\u306e\u7d71\u5408\n    if (app()-&gt;bound('sentry')) {\n        $this-&gt;app-&gt;make('sentry')-&gt;beforeSend(function ($event) {\n            if (app()-&gt;environment('production')) {\n                \/\/ \u6a5f\u5bc6\u60c5\u5831\u306e\u524a\u9664\n                unset($event['request']['cookies']);\n                unset($event['request']['headers']['authorization']);\n            }\n            return $event;\n        });\n    }\n}\n\n\/\/ \u4f7f\u7528\u4f8b\ntry {\n    \/\/ \u5371\u967a\u306a\u64cd\u4f5c\n} catch (Exception $e) {\n    if (app()-&gt;bound('sentry')) {\n        app('sentry')-&gt;captureException($e);\n    }\n    throw $e;\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30ab\u30b9\u30bf\u30e0\u30e2\u30cb\u30bf\u30ea\u30f3\u30b0\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ExceptionMonitor\n{\n    protected $threshold = 10;\n    protected $timeWindow = 300; \/\/ 5\u5206\n\n    public function handleException($e)\n    {\n        $key = $this-&gt;getExceptionKey($e);\n\n        \/\/ Redis\u3092\u4f7f\u7528\u3057\u305f\u4f8b\u5916\u767a\u751f\u56de\u6570\u306e\u8ffd\u8de1\n        $count = Redis::incr($key);\n        Redis::expire($key, $this-&gt;timeWindow);\n\n        if ($count &gt;= $this-&gt;threshold) {\n            $this-&gt;notifyHighFrequencyException($e, $count);\n            Redis::del($key);\n        }\n    }\n\n    protected function getExceptionKey($e)\n    {\n        return 'exception:' . get_class($e) . ':' . date('YmdHi');\n    }\n\n    protected function notifyHighFrequencyException($e, $count)\n    {\n        Notification::route('slack', config('services.slack.webhook'))\n            -&gt;notify(new HighFrequencyExceptionNotification($e, $count));\n    }\n}<\/pre>\n\n\n\n<p>\u30c7\u30d0\u30c3\u30b0\u3068\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30d0\u30c3\u30b0\u30c4\u30fc\u30eb\u3092\u52b9\u679c\u7684\u306b\u6d3b\u7528\u3059\u308b<\/li>\n\n\n\n<li>\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u60c5\u5831\u3092\u5341\u5206\u306b\u53ce\u96c6\u3059\u308b<\/li>\n\n\n\n<li>\u74b0\u5883\u306b\u5fdc\u3058\u3066\u9069\u5207\u306a\u30c7\u30d0\u30c3\u30b0\u60c5\u5831\u3092\u63d0\u4f9b\u3059\u308b<\/li>\n\n\n\n<li>\u4e00\u822c\u7684\u306a\u4f8b\u5916\u30d1\u30bf\u30fc\u30f3\u306b\u5bfe\u3059\u308b\u6a19\u6e96\u7684\u306a\u5bfe\u51e6\u65b9\u6cd5\u3092\u7528\u610f<\/li>\n\n\n\n<li>\u672c\u756a\u74b0\u5883\u3067\u306e\u76e3\u8996\u4f53\u5236\u3092\u6574\u5099\u3059\u308b<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306b\u914d\u616e\u3057\u305f\u60c5\u5831\u53ce\u96c6\u3092\u884c\u3046<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u624b\u6cd5\u3092\u9069\u5207\u306b\u6d3b\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u30c7\u30d0\u30c3\u30b0\u3068\u554f\u984c\u89e3\u6c7a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-80\">Laravel \u4f8b\u5916\u306e\u30c6\u30b9\u30c8<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-81\">\u4f8b\u5916\u51e6\u7406\u306e\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u4f5c\u6210<\/h3>\n\n\n\n<p>\u4f8b\u5916\u51e6\u7406\u306e\u4fe1\u983c\u6027\u3092\u78ba\u4fdd\u3059\u308b\u305f\u3081\u306e\u30c6\u30b9\u30c8\u624b\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentServiceTest extends TestCase\n{\n    \/**\n     * @test\n     * @expectedException App\\Exceptions\\PaymentFailedException\n     *\/\n    public function process_payment_throws_exception_on_failure()\n    {\n        $service = new PaymentService();\n\n        $this-&gt;expectException(PaymentFailedException::class);\n        $this-&gt;expectExceptionMessage('\u6c7a\u6e08\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f');\n\n        $service-&gt;processPayment([\n            'amount' =&gt; 1000,\n            'card_number' =&gt; '1234-5678-9012-3456'\n        ]);\n    }\n\n    \/** @test *\/\n    public function handler_returns_correct_status_code()\n    {\n        $exception = new PaymentFailedException('\u6c7a\u6e08\u30a8\u30e9\u30fc');\n        $request = Request::create('\/api\/payment', 'POST');\n\n        $response = app(Handler::class)-&gt;render($request, $exception);\n\n        $this-&gt;assertEquals(400, $response-&gt;getStatusCode());\n        $this-&gt;assertJsonStringEqualsJsonString(\n            json_encode(['error' =&gt; '\u6c7a\u6e08\u30a8\u30e9\u30fc']),\n            $response-&gt;getContent()\n        );\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u306e\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ExceptionContextTest extends TestCase\n{\n    \/** @test *\/\n    public function custom_exception_includes_correct_context()\n    {\n        $user = factory(User::class)-&gt;create();\n        $this-&gt;actingAs($user);\n\n        $exception = new CustomException('\u30c6\u30b9\u30c8\u30a8\u30e9\u30fc');\n\n        $context = $exception-&gt;context();\n\n        $this-&gt;assertEquals($user-&gt;id, $context['user_id']);\n        $this-&gt;assertArrayHasKey('request_id', $context);\n        $this-&gt;assertArrayHasKey('url', $context);\n    }\n\n    \/** @test *\/\n    public function debug_data_is_only_included_in_local_environment()\n    {\n        $exception = new CustomException('\u30c6\u30b9\u30c8\u30a8\u30e9\u30fc');\n\n        \/\/ \u30ed\u30fc\u30ab\u30eb\u74b0\u5883\n        app()['env'] = 'local';\n        $debugData = $exception-&gt;getDebugData();\n        $this-&gt;assertNotNull($debugData);\n        $this-&gt;assertArrayHasKey('trace', $debugData);\n\n        \/\/ \u672c\u756a\u74b0\u5883\n        app()['env'] = 'production';\n        $debugData = $exception-&gt;getDebugData();\n        $this-&gt;assertNull($debugData);\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-82\">\u30e2\u30c3\u30af\u3092\u4f7f\u7528\u3057\u305f\u4f8b\u5916\u30c6\u30b9\u30c8<\/h3>\n\n\n\n<p>\u5916\u90e8\u30b5\u30fc\u30d3\u30b9\u3068\u306e\u9023\u643a\u306b\u304a\u3051\u308b\u4f8b\u5916\u30c6\u30b9\u30c8\u306e\u65b9\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b5\u30fc\u30d3\u30b9\u306e\u30e2\u30c3\u30af\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PaymentControllerTest extends TestCase\n{\n    \/** @test *\/\n    public function payment_failure_is_handled_correctly()\n    {\n        \/\/ PaymentService\u306e\u30e2\u30c3\u30af\u4f5c\u6210\n        $paymentService = $this-&gt;mock(PaymentService::class);\n\n        \/\/ \u30e2\u30c3\u30af\u306e\u632f\u308b\u821e\u3044\u3092\u5b9a\u7fa9\n        $paymentService-&gt;shouldReceive('processPayment')\n            -&gt;once()\n            -&gt;andThrow(new PaymentFailedException('\u6c7a\u6e08\u30a8\u30e9\u30fc'));\n\n        \/\/ \u30c6\u30b9\u30c8\u30ea\u30af\u30a8\u30b9\u30c8\u306e\u5b9f\u884c\n        $response = $this-&gt;postJson('\/api\/payment', [\n            'amount' =&gt; 1000,\n            'card_number' =&gt; '1234-5678-9012-3456'\n        ]);\n\n        \/\/ \u30ec\u30b9\u30dd\u30f3\u30b9\u306e\u691c\u8a3c\n        $response-&gt;assertStatus(400)\n            -&gt;assertJson(['error' =&gt; '\u6c7a\u6e08\u30a8\u30e9\u30fc']);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u8907\u96d1\u306a\u4f8b\u5916\u30b7\u30ca\u30ea\u30aa\u306e\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OrderProcessingTest extends TestCase\n{\n    \/** @test *\/\n    public function multiple_exceptions_are_handled_correctly()\n    {\n        \/\/ \u4f9d\u5b58\u30b5\u30fc\u30d3\u30b9\u306e\u30e2\u30c3\u30af\n        $this-&gt;mock(InventoryService::class, function ($mock) {\n            $mock-&gt;shouldReceive('checkStock')\n                -&gt;andThrow(new OutOfStockException('\u5728\u5eab\u4e0d\u8db3'));\n        });\n\n        $this-&gt;mock(NotificationService::class, function ($mock) {\n            $mock-&gt;shouldReceive('notifyAdmin')\n                -&gt;andReturn(true);\n        });\n\n        \/\/ \u4f8b\u5916\u51e6\u7406\u306e\u691c\u8a3c\n        try {\n            $orderService = app(OrderService::class);\n            $orderService-&gt;process($this-&gt;getTestOrder());\n\n            $this-&gt;fail('\u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u305b\u3093\u3067\u3057\u305f');\n        } catch (OutOfStockException $e) {\n            $this-&gt;assertEquals('\u5728\u5eab\u4e0d\u8db3', $e-&gt;getMessage());\n            $this-&gt;assertNotNull($e-&gt;getOrder());\n        }\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-83\">\u30c6\u30b9\u30c8\u74b0\u5883\u3067\u306e\u4f8b\u5916\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3<\/h3>\n\n\n\n<p>\u69d8\u3005\u306a\u4f8b\u5916\u72b6\u6cc1\u3092\u30b7\u30df\u30e5\u30ec\u30fc\u30c8\u3059\u308b\u30c6\u30b9\u30c8\u624b\u6cd5\u3067\u3059\u3002<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4f8b\u5916\u767a\u751f\u6761\u4ef6\u306e\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ExceptionSimulationTest extends TestCase\n{\n    \/** @test *\/\n    public function database_exceptions_are_handled()\n    {\n        \/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u4f8b\u5916\u306e\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\n        DB::shouldReceive('transaction')\n            -&gt;once()\n            -&gt;andThrow(new QueryException(\n                'select * from users',\n                [],\n                new \\Exception('\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a8\u30e9\u30fc')\n            ));\n\n        $response = $this-&gt;post('\/api\/users', [\n            'name' =&gt; '\u30c6\u30b9\u30c8\u30e6\u30fc\u30b6\u30fc'\n        ]);\n\n        $response-&gt;assertStatus(500)\n            -&gt;assertJson(['error' =&gt; '\u30b7\u30b9\u30c6\u30e0\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f']);\n    }\n\n    \/** @test *\/\n    public function rate_limit_exceptions_are_handled()\n    {\n        \/\/ \u30ec\u30fc\u30c8\u5236\u9650\u306e\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\n        $this-&gt;withoutExceptionHandling();\n\n        for ($i = 0; $i &lt; 61; $i++) {\n            $response = $this-&gt;getJson('\/api\/status');\n        }\n\n        $response-&gt;assertStatus(429)\n            -&gt;assertJson(['error' =&gt; 'Too Many Requests']);\n    }\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u975e\u540c\u671f\u51e6\u7406\u306e\u4f8b\u5916\u30c6\u30b9\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class AsyncExceptionTest extends TestCase\n{\n    \/** @test *\/\n    public function failed_job_is_handled_correctly()\n    {\n        \/\/ \u30b8\u30e7\u30d6\u5931\u6557\u306e\u30b7\u30df\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\n        Queue::fake();\n\n        ProcessPayment::dispatch($this-&gt;getTestOrder());\n\n        Queue::assertPushed(ProcessPayment::class, function ($job) {\n            return $job-&gt;order-&gt;id === $this-&gt;getTestOrder()-&gt;id;\n        });\n\n        \/\/ \u5931\u6557\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u30c6\u30b9\u30c8\n        Event::fake();\n\n        $job = new ProcessPayment($this-&gt;getTestOrder());\n        $job-&gt;failed(new \\Exception('\u30b8\u30e7\u30d6\u5931\u6557'));\n\n        Event::assertDispatched(JobFailed::class);\n    }\n}<\/pre>\n\n\n\n<p>\u4f8b\u5916\u30c6\u30b9\u30c8\u306e\u30dd\u30a4\u30f3\u30c8\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u57fa\u672c\u7684\u306a\u4f8b\u5916\u767a\u751f\u306e\u30c6\u30b9\u30c8\u3092\u78ba\u5b9f\u306b\u884c\u3046<\/li>\n\n\n\n<li>\u30e2\u30c3\u30af\u3092\u4f7f\u7528\u3057\u3066\u5916\u90e8\u4f9d\u5b58\u3092\u5236\u5fa1\u3059\u308b<\/li>\n\n\n\n<li>\u74b0\u5883\u306b\u3088\u308b\u52d5\u4f5c\u306e\u9055\u3044\u3092\u8003\u616e\u3057\u305f\u30c6\u30b9\u30c8<\/li>\n\n\n\n<li>\u8907\u96d1\u306a\u4f8b\u5916\u30b7\u30ca\u30ea\u30aa\u3082\u30ab\u30d0\u30fc<\/li>\n\n\n\n<li>\u975e\u540c\u671f\u51e6\u7406\u306e\u4f8b\u5916\u3082\u9069\u5207\u306b\u30c6\u30b9\u30c8<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u95a2\u9023\u306e\u4f8b\u5916\u306f\u7279\u306b\u6ce8\u610f\u6df1\u304f\u30c6\u30b9\u30c8<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u30c6\u30b9\u30c8\u624b\u6cd5\u3092\u9069\u5207\u306b\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3067\u3001\u4f8b\u5916\u51e6\u7406\u306e\u4fe1\u983c\u6027\u3092\u78ba\u4fdd\u3067\u304d\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":{"0":"post-2575","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2575","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2575"}],"version-history":[{"count":2,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2575\/revisions"}],"predecessor-version":[{"id":2577,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2575\/revisions\/2577"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2575"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}