iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Modern Web

.NET教我做人系列 第 15

Day15 出了問題怎麼辦

  • 分享至 

  • xImage
  •  

大家好啊,今天已經是第15天了,沒想到時間過得這麼快,那表示我還有15天還要努力,這好像是廢話,哈哈~

哪我們就不多說廢話,就直接開始進入我們的主題啦,身為一個寫程式的人,我們在開發一個專案時一定會常常遇到報錯的問題,身為工程師我們最要有的能力應該就是解決問題,但在解決問題前我們要先知道問題在哪,所以今天就是要來說在ASP.NET CORE 開發時要怎麼去把錯誤的訊息給列印出來

開發人員例外狀況頁面

通常在開發期間,還是希望能直接看到錯誤資訊,會比較方便除錯。UseDeveloperExceptionPage 是 ASP.NET Core 提供的錯誤資訊頁面服務,常注入在Program.cs之中

if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
    app.UseSwagger();
    app.UseSwaggerUI();
}

在一般的使用情況下,會收到純文字的錯誤訊息,下方是出現在使用swagger時

或是網頁會出現下面的訊息

自訂例外事件處理

我們除了是用預設的例外狀況頁面以外,我們也可以用UseExceptionHandler的中介軟體來指向我們例外事件的頁面

首先我們可以在剛剛的判斷是新增我們自訂的指定位置,這裡我們會找到/error的位置

if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
    app.UseSwagger();
    app.UseSwaggerUI();
}
else
{
    app.UseExceptionHandler("/error");
}

再來我們先去新增一個error的控制器,裡面會有我們所要報的錯誤訊息

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace WepApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ErrorController : ControllerBase
    {
        [Route("/error")]
        public ActionResult Error() => Problem();
    }
}

這裡我們就現開瀏覽器輸入localhost:<port>/error後應該會出現以下訊息,上述名為Error的Action會將RFC 7231格式的錯誤訊息回傳至用戶端,這裡都可以依需求做調整

{
 "type":"https://tools.ietf.org/html/rfc7231#section-6.6.1",
 "title":"An error occurred while processing your request.",
 "status":500,
 "traceId":"00-45ee30b8c5f4ffd103697bb9cc4fc795-57fbe60f0454f4f3-00"
}

這裡先做個補充

請勿使用 HTTP 方法屬性標記錯誤處理常式動作方法,例如 HttpGet 。 明確動詞命令可防止某些要求到達動作方法

對於使用 Swagger / OpenAPI的 Web API,請使用 [ApiExplorerSettings] 屬性標記錯誤處理常式動作,並將其 IgnoreApi 屬性設定為 true

[ApiExplorerSettings(IgnoreApi = true)]

為甚麼要用例外處裡

在我的認知中使用例外處理的狀況是因為當我們開發一個Web時通常使用者不會直接看到我們程式碼的部分,基於安全的部分所以我們在商品上市時不會讓使用者看到我們的程式碼只會出現錯誤的訊息常見的應該就是404或500等訊息,而例外處理最主要是要讓工程是在開發上可以快速地去debug,這是我自己在看完一些影片後的小心得

今天的鐵人賽就先到這裡,今天比較累,就先到這裡,哪我們就明天見拉~

參考資料:
https://blog.johnwu.cc/article/ironman-day17-asp-net-core-exception-handler.html
https://learn.microsoft.com/zh-tw/aspnet/core/web-api/handle-errors?view=aspnetcore-6.0


上一篇
Day14 路由給了我方向
下一篇
Day16 API神器Postman(上)
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言