Универсальный хост .NET: предотвращение сбоя приложения при необработанном исключении.C#

Место общения программистов C#
Anonymous
Универсальный хост .NET: предотвращение сбоя приложения при необработанном исключении.

Сообщение Anonymous »

У меня есть универсальный хост .NET с IHostedService, который получает события от интерфейса OPC-UA и обрабатывает их.

Проблема в том, что если во время обработки события возникает необработанное исключение, то все приложение вылетает

Я читал документацию, но не нашел ничего о глобальном обработчике исключений или подобном механизм, позволяющий перехватывать необработанное исключение и предотвращать сбой приложения.

Есть ли решение для защиты универсального хоста, а также IHostedService от необработанных исключений ?

РЕДАКТИРОВАТЬ

Я знаю, здесь самое простое — попробовать/перехватить исключение и не допустить его пузыриться. Но мне хотелось бы знать, существует ли аналогичный механизм, как в WinForms/WPF, где вы можете более глобально перехватывать такие исключения и предотвращать сбой.

РЕДАКТИРОВАТЬ p>

Это упрощенная версия кода:

Код: Выделить всё

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}

public static IHostBuilder CreateHostBuilder(string[] args)
{
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
return new HostBuilder()
.UseEnvironment(environmentName)
.ConfigureLogging((hostContext, logging) =>
{
...
})
.ConfigureAppConfiguration((hostContext, builder) =>
{
builder
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true, true)
.AddEnvironmentVariables();
})
.ConfigureServices((hostContext, services) =>
{
services.AddSingleton();
...
});
}
}

public class OpcClientHostedService : IHostedService
{
private readonly OpcConfiguration _opcConfiguration;
private readonly ILogger _logger;
private readonly OpcClient _opcClient;

public OpcClientHostedService(OpcConfiguration opcConfiguration, ILogger logger)
{
_opcConfiguration = opcConfiguration;
_logger = logger;
_opcClient = new OpcClient(opcConfiguration.ServerUri);
}

public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Connecting to OPC server with URI '{0}'", _opcConfiguration.ServerUri);
try
{
_opcClient.Connect();
}
catch (Exception ex)
{
_logger.LogCritical(ex, "Cannot connect to OPC server");
throw;
}
_logger.LogInformation("Connection to OPC server is successful");

CreateOpcObservable().Subscribe(async args => await ProcessOpcEvent(args));

return Task.CompletedTask;
}

private async Task ProcessOpcEvent(OpcValueChangedEventArgs args)
{
await MethodThatCanThrowAnException(args); // If the exception is not handled, the whole application crashes!
}

public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Disconnecting to OPC server");
_opcClient.Disconnect();
_logger.LogInformation("Disconnection to OPC server is successful");
return Task.CompletedTask;
}

...
}
В этом примере легко добавить блок try/catch в метод ProcessOpcEvent, но было бы здорово иметь механизм, позволяющий избежать завершения сбой приложения в такой ситуации.

Подробнее здесь: https://stackoverflow.com/questions/520 ... -exception

Вернуться в «C#»