发生异常时如何从代码内部获取值?

How to get the values from inside the code when exception occurs?

我在 .net core 3.1 中有一个 worker 服务 在我的 Program.cs 中,我有以下代码

   public static void Main(string[] args)
    {
        try
        {
            CreateHostBuilder(args).Build().Run();
        }
        catch(Exception ex)
        {
            Handler(ex);
        }
       
    }

 static void Handler( Exception e)
    {
        var logger = NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
        List<Test> _Test = new List<Test>()
        {
            new Test()
            {
                  
            }
        };
        LogEventInfo eventInfo = new LogEventInfo
        {
            Level = LogLevel.Error,
            Properties = { { "Application",_Test } }
        };
        logger.Log(eventInfo);  
    }

private class Test
{
 public string Name{get;set;}
 public string Place{get;set;}
}

在我的 worker class 我有如下代码

public class Worker : BackgroundService
{ 
  
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        
        do
        {
           
           string Name  ="MyName";// These values will be fetched from different file
           string Place="MyPlace";
        //Some Logic where an exception may occur
        }
        while (!stoppingToken.IsCancellationRequested);

    }
}

有没有办法将worker class的NamePlace的值获取到程序[=中的Handler方法24=] 出现异常时。由于我正在考虑全局异常处理程序,因此我正在考虑不再放置任何 try catch 块。我想用 program.cs 文件中的 try catch 处理所有异常。在这种情况下,我如何才能将 Name 和 Place 值添加到我的处理程序中以便记录下来?

创建一个自定义异常 class,您可以在其中将名称和地点设置为属性。 在 Worker 中,在可能抛出异常的代码周围添加一个 try catch 块。创建并抛出您的自定义异常,将原始异常设置为 InnerException (https://docs.microsoft.com/en-us/dotnet/api/system.exception.innerexception?view=net-6.0)

然后在您的处理程序中从包装器异常中获取名称/位置,然后使用 InnerException 处理其余部分。

虽然自定义异常是可能的,但您也可以使用 Data 属性:

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
    do
    {
        string Name = "MyName";
        string Place = "MyPlace";

        try
        {
            //Some Logic where an exception may occur
        }
        catch (Exception e)
        {
            e.Data["Name"] = Name;
            e.Data["Place"] = Place;
            throw;
        }
    }
    while (!stoppingToken.IsCancellationRequested);
}