发生异常时如何从代码内部获取值?
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的Name和Place的值获取到程序[=中的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);
}
我在 .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的Name和Place的值获取到程序[=中的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);
}