我有一个特别难看的测试代码,它在硬件设备上调用了许多方法来测试它的功能。它需要优雅地失败,因为如果任何方法抛出异常,我不会对其他人进行测试。是否有更优雅的方式来表示我想要生成异常的调用块?
...
try
{
ExternalDevice.Call1();
}
catch (Exception e)
{}
try
{
ExternalDevice.Call2();
}
catch (Exception e)
{}
try
{
ExternalDevice.Call3();
} catch (Exception e)
{}
//... many more like this
...
由于
答案 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));
}