gpt4 book ai didi

c# - 如何在 ASP.NET Web Api 服务中不抛出异常?

转载 作者:太空宇宙 更新时间:2023-11-03 10:55:32 26 4
gpt4 key购买 nike

我正在构建一个 ASP.NET Web Api 服务,我想创建集中的异常处理代码。

我想以不同的方式处理不同类型的异常。我将使用 log4net 记录所有异常。对于某些类型的异常,我想通过电子邮件通知管理员。对于某些类型的异常,我想重新抛出一个更友好的异常,该异常将返回给调用者。对于某些类型的异常,我只想继续从 Controller 处理。

但是我该怎么做呢?我正在使用异常过滤器属性。我有这个代码工作。该属性已正确注册并且代码正在触发。我只想知道如果抛出某些类型的异常我该如何继续。希望这是有道理的。

public class MyExceptionHandlingAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
//Log all errors
_log.Error(myException);

if(myException is [one of the types I need to notify about])
{
...send out notification email
}

if(myException is [one of the types that we continue processing])
{
...don't do anything, return back to the caller and continue
...Not sure how to do this. How do I basically not do anything here?
}

if(myException is [one of the types where we rethrow])
{
throw new HttpResponseException(new HttpResponseMessage(StatusCode.InternalServerError)
{
Content = new StringContent("Friendly message goes here."),
ReasonPhrase = "Critical Exception"
});
}
}
}

最佳答案

For some types of exceptions I want to just continue processing from the controller. But how do I do that?

通过在您希望此行为发生的地方编写 try..catch。参见 Resuming execution of code after exception is thrown and caught .

为了澄清,我假设你有这样的东西:

void ProcessEntries(entries)
{
foreach (var entry in entries)
{
ProcessEntry(entry);
}
}

void ProcessEntry(entry)
{
if (foo)
{
throw new EntryProcessingException();
}
}

而当EntryProcessingException 被抛出时,您实际上并不关心并希望继续执行。


如果这个假设是正确的:你不能用全局异常过滤器来做到这一点,因为一旦异常被捕获,就不会返回到它被抛出的地方执行。 There is no On Error Resume Next在 C# 中,尤其是当使用过滤器处理异常时 @Marjan explained .

因此,从您的过滤器中移除 EntryProcessingException,并通过更改循环主体来捕获该特定异常:

void ProcessEntries(entries)
{
foreach (var entry in entries)
{
try
{
ProcessEntry(entry);
}
catch (EntryProcessingException ex)
{
// Log the exception
}
}
}

你的循环会愉快地旋转到它的末尾,但抛出所有其他异常,它将由你的过滤器处理。

关于c# - 如何在 ASP.NET Web Api 服务中不抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19662469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com