Лучшая практика для многих блоков try-catch - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть много утверждений, которые могут генерировать исключения. Исключения не важны.

Моя система принимает пропущенные поля данных пациента.

patientData.PatientId = message.Find(...);
try
{
    patientData.Gender = message.Find(...);
}
catch
{
    // no gender, no problem
}

try
{
    patientData.DateOfBirth = message.Find(...);
}
catch 
{
    // no DateOfBirth, no problem
}
// and many other try-catch blocks ...

Каков наилучший способ написать эти операторы, которые могут генерировать исключения, но не критичные?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

В вашем примере вы можете создать метод stati c TryFindMessage в дополнение к Find. В случае исключения просто верните false. Например: bool Message.TryFind(..., Message message, out string result).

Но если у вас есть sh какой-то обобщенный c подход, который вы можете использовать с чем угодно, тогда вы можете воспользоваться делегатами и создать некоторый помощник stati c.

В этом случае вы можете использовать Action или Func. Добавьте другой метод расширения, который принимает Func, если вам нужно вернуть какое-то значение из выполненной функции.

 public static class SilentRunner
    {
        public static void Run(Action action, Action<Exception> onErrorHandler)
        {
            try
            {
                action();
            }
            catch (Exception e)
            {
                onErrorHandler(e);
            }
        }

        public static T Run<T>(Func<T> func, Action<Exception> onErrorHandler)
        {
            try
            {
                return func();
            }
            catch (Exception e)
            {
                onErrorHandler(e);
            }

            return default(T);
        }
    }

И затем используйте его так:

SilentRunner.Run(
     () => DoSomething(someObject),
     ex => DoSomethingElse(someObject, ex));

В случае Func Вы также можете получить результат:

var result = SilentRunner.Run(
     () => DoSomething(someObject),
     ex => DoSomethingElse(someObject, ex));
1 голос
/ 13 апреля 2020

У меня есть много утверждений, которые могут генерировать исключения. Исключения не важны.

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

Я бы посоветовал вместо того, чтобы глотать исключение, изменить код для возврата значения по умолчанию (null), когда значение не найдено.

Вы можете ввести новый метод в класс message, например FindOrDefault

// Pseudo code
public T FindOrDefault(string property)
{
     return CanFind(property) ? Find(property) : default(T);
}

Использование таких метод будет самоочевидным

patientData.PatientId = message.Find(...); // Mandatory - must throw if not found
patientData.Gender = message.FindOrDefault(...);
patientData.DateOfBirth = message.FindOrDefault(...);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...