编写一个调用块以避免抛出任何异常

时间:2011-11-01 12:07:45

标签: c# exception

我有一个特别难看的测试代码,它在硬件设备上调用了许多方法来测试它的功能。它需要优雅地失败,因为如果任何方法抛出异常,我不会对其他人进行测试。是否有更优雅的方式来表示我想要生成异常的调用块?

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

由于

4 个答案:

答案 0 :(得分:3)

我不建议这样做,但这是一种方式:

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 :(得分:1)

你可以创建一个进行调用的方法,然后隐藏像这样的异常

//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());

我假设您还有其他方法可以查看呼叫是否失败? 更好的解决方案是将每个调用都放在单独的测试中。

答案 2 :(得分:1)

您可以使用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()
    }
}

答案 3 :(得分:1)

我不是C#程序员,但这可能吗?

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

static void Test(){
    InvokeMethod(new Func<>(ExternalDevice.Call1));
}