Как исключение может всплыть за пределы этой задачи? - PullRequest
0 голосов
/ 18 октября 2011

Я думал, что этот подход будет безопасным, поскольку он не позволит распространять исключения. Мой коллега предположил, что исключения должны соблюдаться в главном потоке и, следовательно, должны передаваться в основной поток. Это ответ? Вы видите, как через это может протекать исключение?

    private static void InvokeProcessHandlers<T>(List<T> processHandlers, Action<T> action)
    {            
        // Loop through process handlers asynchronously, giving them each their own chance to do their thing.
        Task.Factory.StartNew(() =>
        {
            foreach (T handler in processHandlers)
            {
                try
                {
                    action.Invoke(handler);
                }
                catch (Exception ex)
                {
                    try
                    {
                        EventLog.WriteEntry(ResourceCommon.LogSource,
                                             String.Format(CultureInfo.CurrentCulture, "An error occurred in a pre- or post-process interception handler: {0}", ex.ToString()),
                                             EventLogEntryType.Error);
                    }
                    catch (Exception)
                    {
                        // Eat it. Nothing else we can do. Something is seriously broken.
                    }

                    continue;  // Don't let one handler failure stop the rest from processing.
                }
            }
        });
    }

Кстати, трассировка стека действительно показывает, что из этого метода вытекает исключение.

Исключением является AccessViolation, и я считаю, что это связано с кодом, вызывающим этот метод:

InvokeProcessHandlers<IInterceptionPostProcessHandler>(InterceptionPostProcessHandlers, handler => handler.Process(methodCallMessage, methodReturnMessage));

Получатель для InterceptionPostProcessHandlers содержит это:

_interceptionPreprocessHandlers = ReflectionUtility.GetObjectsForAnInterface<IInterceptionPreprocessHandler>(Assembly.GetExecutingAssembly());

Ответы [ 2 ]

1 голос
/ 18 октября 2011

Мой коллега предположил, что исключения должны соблюдаться в основном потоке и, следовательно, должны передаваться в главный поток.

Как это можно "пропустить"до основной темы "?Основная нить отсутствует и делает свое дело.

Лучшее, что вы можете сделать, - это настроить его и принять вызываемый делегат ExceptionHandler.

1 голос
/ 18 октября 2011

Просто убедитесь, что параметр проверен на наличие нулевых ссылок, прежде чем выполнять итерацию

кроме того, что в этом нет ничего плохого, так как запись журнала не является чем-то, что останавливает выполнение, но я бы порекомендовал сделать его более чистым и обслуживаемым, инкапсулировав регистрацию в метод вроде:

bool Logger.TryLog(params);

и внутри этого метода сделайте попытку с уловкой, которая возвращает false, и если вы хотите обработать это в клиентском коде, сделайте это, и если вы не возражаете, просто вызовите регистратор чистым инкапсулированным способом

...