Создайте метод, который ловит исключение, если произошло в любом из методов в этом классе в C # - PullRequest
3 голосов
/ 09 июля 2019

У меня есть класс Demo, который имеет четыре метода, как показано ниже Add(), Update(), Delete() и Get().

И эти методы объединены в цепочку, как показано ниже:

bool isSuccess = this.Get(1)
                    .Update(200) //new product price

Теперь я хочу реализовать метод CatchError(), который собирается перехватить Exception if, произошедший в любом из вышеперечисленных методов.

Код будет выглядеть следующим образом:

bool isSuccess = this.Get(1)
                    .Update(200); //new product price
                    .CatchError();

У меня есть no idea, как реализовать метод CatchError().

Буду рад предоставить дополнительную информацию, чтобы правильно ответить на вопросы.

Ответы [ 3 ]

3 голосов
/ 09 июля 2019

Как я уже писал в своем комментарии, я бы попытался создать метод CatchError (), в котором вы предоставляете Action в качестве параметра:

bool isSuccess = CatchError(() => Get(1).Update(200));

Ваш метод CatchError () будет выглядеть следующим образом:

private static bool CatchError(Action action)
{
    try
    {
        action();
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}
1 голос
/ 10 июля 2019

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

Если создание беглого метода не требуется, я бы предложил Presis's answer , потому что он менее сложен.

class Program
{
    static void Main(string[] args)
    {
        Car myCar = new Car();
        bool processCancelled = false;
        myCar.SubscribeOnError(CarOnError).Paint(ref processCancelled, "red").Sell(ref processCancelled, 25000d);
    }

    public static bool CarOnError(Exception e)
    {
        // Log exception
        // Decide if must cancel
        return true;
    }
}

public class Car
{
    private Func<Exception, bool> onErrorMethod = null;

    public Car SubscribeOnError(Func<Exception, bool> methodToCall)
    {
        onErrorMethod = methodToCall;
        return this;
    }
    public Car Paint(ref bool cancelled, string color)
    {
        if (cancelled) return this;
        try
        {
            // Do stuff
        }
        catch (Exception exc)
        {
            cancelled = onErrorMethod == null ? true : onErrorMethod(exc);
        }
        return this;
    }
    public Car Sell(ref bool cancelled, double price)
    {
        if (cancelled) return this;
        try
        {
            // Do stuff
        }
        catch (Exception exc)
        {
            cancelled = onErrorMethod == null ? true : onErrorMethod(exc);
        }
        return this;
    }
}
1 голос
/ 09 июля 2019

Для достижения этого вы должны выполнять все операции, только если вызывается CatchError. До этого вы должны собрать все действия, которые должны быть выполнены. Что-то вроде:

public class Demo
{
    private int Value;
    private List<Action> Operations = new List<Action>();
    public Demo Get(int a)
    {
        this.Operations.Add(() => this.Value = a);
        return this;
    }

    public Demo Update(int a)
    {
        this.Operations.Add(() => this.Value += a);
        return this;
    }

    public bool CatchError()
    {
        foreach (var operation in Operations)
        {
            try
            {
                operation();
            }
            catch (Exception e)
            {
                return false;
            }
        }
        Operations.Clear();
        return true;
    }
}
...