Написание блока вызовов, чтобы избежать каких-либо исключений - PullRequest
2 голосов
/ 01 ноября 2011

У меня особенно некрасивый кусок тестового кода, который вызывает несколько методов на аппаратном устройстве для проверки его возможностей. Он должен терпеть неудачу в том, что если какой-либо из методов выдает исключение, я не хочу, чтобы другие все еще тестировались. Есть ли более элегантный способ представления блока вызовов, ни один из которых я не хочу генерировать исключение?

 ...
 try
 {
     ExternalDevice.Call1();
 }
 catch (Exception e)
 {}
 try
 {
     ExternalDevice.Call2();
 }
 catch (Exception e)
 {}
 try
 {
     ExternalDevice.Call3(); 
 } catch (Exception e)
 {}
 //... many more like this
 ...

Спасибо

Ответы [ 4 ]

3 голосов
/ 01 ноября 2011

Я не рекомендую делать это, но есть способ:

void Absorb(Action action)
{
     try { action(); } catch { };
}

// ....
Absorb(() => ExternalDevice.Call1());
Absorb(() => ExternalDevice.Call2());
Absorb(() => ExternalDevice.Call3());

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

Absorb(ExternalDevice.Call1);
Absorb(ExternalDevice.Call2);
Absorb(ExternalDevice.Call3);

Чтобы сделать его еще короче,

void Absorb(params Action[] actions)
{
     foreach (var action in actions) try { action(); } catch { };
}

So you can

Absorb(ExternalDevice.Call1, ExternalDevice.Call2, ExternalDevice.Call3);
1 голос
/ 01 ноября 2011

Я не программист на C #, но возможно ли это сделать?

static object InvokeMethod(Delegate method){
    try{
        method.DynamicInvoke();
    } catch (Exception e)
    {}
}

static void Test(){
    InvokeMethod(new Func<>(ExternalDevice.Call1));
}
1 голос
/ 01 ноября 2011

Вы можете использовать список Action s:

Action[] actions = new Action[]
{
    ExternalDevice.Call1,
    ExternalDevice.Call2,
    ExternalDevice.Call3
};

foreach (Action action in actions)
{
    try
    {
        action();
    }
    catch (Exception e)
    {
        // Error with this action()
    }
}
1 голос
/ 01 ноября 2011

Вы можете создать метод, который выполняет вызов, а затем скрывает исключения, например:

//Use only for test code
private void CallAndIgnoreException(Action action)
{
    try
    {
        action();
    }
    catch
    {
         //probably want to add some logging here
    }
}

Тогда вы можете просто сделать

CallAndIgnoreException(() => ExternalDevice.Call1());
CallAndIgnoreException(() => ExternalDevice.Call2());
CallAndIgnoreException(() => ExternalDevice.Call3());

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...