我已经看过类似的问题(例如here和here),但我仍然不确定为什么我的代码的行为方式如此。 我正在编写一些使用异步函数执行某些线程特定工作的单元测试,但问题是抛出的异常没有被捕获。这是我的意思的一个简单例子:
static void Main(string[] args)
{
ExecuteWillCatch(async () =>
{
await MyTaskFunction();
throw new Exception("I throw an exception");
});
}
static void MyAction()
{
MyTaskFunction();
throw new Exception("I throw an exception!");
}
static async Task MyTaskFunction()
{
}
static void ExecuteWillCatch(Action action)
{
var op = new ThreadStart(() =>
{
try
{
action.Invoke();
}
catch (Exception e)
{
Console.WriteLine("I caught the exception");
}
});
var thread = new Thread(op);
thread.Start();
thread.Join();
}
如果我在我的测试中使用async
lambda,那么会发生异常,即在预期的目标上抛出异常,然后在mscorlib中重新抛出,然后在try中捕获 not ExecuteWillCatch中的-catch块。如果我只是等待结果替换async / await,一切都会通过。这是我可以使用的解决方法,但我希望理想地测试将要使用的代码(使用async / await)。
我也尝试在主函数中放置try-catch块,并在线程调用周围,认为可能异常被抛回到该线程,但情况也不是这样。
任何人都可以建议一种方法来做到这一点,或解释为什么它不起作用?