Skip to main content
 首页 » 编程设计

c#之c# WebAPI 中的异常处理程序

2024年04月30日36TianFang

我有一个关于这个东西究竟是如何工作的问题。

public class GlobalExceptionHandler: ExceptionHandler 
{ 
    private string _pvtMsg; 
 
    public override void handle(ExceptionHandlerContext context) 
    { 
        //few if else conditions 
        if() 
        { 
        } 
        else if 
        { 
            _pvtMsg = "some value"; 
        } 
        context.Result="Some random value depending upon if else execution"; 
    } 
} 

现在当 _pvtMsg 被设置之后,无论何时发生异常,它总是具有与以前相同的值。

请问,当我在else if条件中设置_pvtMsg = "a";时,下次出错时_pvtMsg还是有值 "a"?

在我的应用程序的整个生命周期中是否只有一个 handler 实例可用,因此会发生这种情况?还是有其他原因?任何引用文件将不胜感激。

顺便说一句:此处理程序使用 WebApiConfig 的 Register 方法注册。

config.Services.Replace(typeof(IExceptionHandler), new GlobalExceptionHandler());  

请您参考如下方法:

你的假设是正确的。由于您注册了 GlobalExceptionHandler 的 Instance(使用 new 关键字)_pvrMsg 将始终具有前一个值(成功)调用。

如果 _pvrMsg 对您计划在 if block 中执行的任何操作至关重要,我建议锁定这部分代码以确保 处理 不会一次执行多次。

最简单的方法是:

public class GlobalExceptionHandler: ExceptionHandler 
{ 
    private string _pvtMsg; 
    private readonly object _lock = new object(); 
 
    public override void handle(ExceptionHandlerContext context) 
    { 
        lock(_lock) 
        { 
            //few if else conditions 
            if() 
            { 
            } 
            else if 
            { 
                _pvtMsg = "some value"; 
            } 
            context.Result="Some random value depending upon if else execution"; 
        } 
    } 
}