从 asp.net 个控制器中删除 Try/Catch 个语句
Remove Try/Catch statements from asp.net controllers
我有一个 Asp.Net 核心 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 语句并编写一个基础 class 或其他东西来处理我的控制器外的这个 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
}
我听说过一些关于横切关注点的事情,但我不知道如何使用它们。
你知道我该怎么做吗?
完全同意,任何 try/catch 到处实施的东西都是代码味道,并且有更好的做事方式。
如果您搜索 'Global Exception Handling netcore',您会发现很多与此主题相关的结果。
一般来说,让异常向上传播堆栈,保留所有异常细节并让它被中间件捕获和处理。可能有太多代码无法摘录到这个答案中,但这是一篇不错的文章,其中有几个不同的 versions/examples 可用
https://jasonwatmore.com/post/2022/01/17/net-6-global-error-handler-tutorial-with-example
您会注意到从中间件返回响应,这也是您集中执行日志记录的机会 - 一个捕获和记录所有异常详细信息的地方。
一个简单的方法:
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();
});
我有一个 Asp.Net 核心 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 语句并编写一个基础 class 或其他东西来处理我的控制器外的这个 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
}
我听说过一些关于横切关注点的事情,但我不知道如何使用它们。
你知道我该怎么做吗?
完全同意,任何 try/catch 到处实施的东西都是代码味道,并且有更好的做事方式。
如果您搜索 'Global Exception Handling netcore',您会发现很多与此主题相关的结果。
一般来说,让异常向上传播堆栈,保留所有异常细节并让它被中间件捕获和处理。可能有太多代码无法摘录到这个答案中,但这是一篇不错的文章,其中有几个不同的 versions/examples 可用
https://jasonwatmore.com/post/2022/01/17/net-6-global-error-handler-tutorial-with-example
您会注意到从中间件返回响应,这也是您集中执行日志记录的机会 - 一个捕获和记录所有异常详细信息的地方。
一个简单的方法:
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();
});