我有一個 Asp.Net core 3.1 Web Api 專案,我有很多控制器。
幾乎在每個控制器中,我都有一個這樣的模板:
public class SomeController:ControllerBase
{
//injecting my service
[HttpGet]
[Route("")]
public async Task<ActionResult> SomeMethod()
{
try
{
//Do some work
return Ok(somevalue);
}
catch(ServiceException ex)
{
return BadRequest(ex.Message);
}
catch
{
return BadRequest();
}
}
}
這個模板在幾乎所有的控制器中都實作了。
我想洗掉 try...catch 陳述句并撰寫一個基類或其他東西來處理我的控制器之外的這個 try...catch 陳述句。
我認為是這樣的:
public async Task<ActionResult> SomeMethod()
{
//Do some work
return Ok(somevalue);
//if any exception of ServiceException type occured i want to
//return BadRequest with message and if not a BadRequest without message
}
我聽說過一些關于橫切關注點的東西,但我不知道如何使用它們。
你有什么想法我該怎么做?
uj5u.com熱心網友回復:
完全同意,任何在任何地方都實作了 try/catch 的東西都是代碼味道,并且有更好的做事方式。
如果您搜索“全域例外處理 netcore”,您會發現很多關于此主題的文章。
一般來說,讓例外向上傳播堆疊,保留所有例外細節并讓它被中間件捕獲和處理。可能有太多代碼無法插入這個答案,但這里有一些不錯的文章,有幾個不同的版本/示例可用
https://jasonwatmore.com/post/2022/01/17/net-6-global-error-handler-tutorial-with-example
您會注意到來自中間件的回傳回應,這也是您集中執行日志記錄的機會 - 一個捕獲和記錄所有例外詳細資訊的地方。
uj5u.com熱心網友回復:
一個簡單的方法:
public static ActionResult Try(Func<ActionResult> action)
{
try
{
return action();
}
catch (ServiceException ex)
{
return BadRequest(ex.Message);
}
catch
{
return BadRequest();
}
}
你像這樣使用:
return Try(() => Ok(someValue));
或者
return Try(() =>
{
// Do something...
return new EmptyResult();
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/468594.html
標籤:C# asp.net 核心 asp.net-core-webapi 跨领域关注
