带有 Try Catch 的 while 循环在循环结束后抛出异常
A while loop with Try Catch throws exceptions after loop ends
我正在使用 C# 中的 Nunit 和 selenium 编写一些网络测试
我做了一个导致一些奇怪行为的方法。
方法的重点是尝试一些动作。
如果操作成功退出方法。
如果操作抛出异常,请等待 100 毫秒,然后重试。
如果操作已尝试超过某个超时整数,则抛出超时异常。
我还想添加一个选项,以便在操作引发异常时执行其他操作。
这是代码:
public void Tryfor(Action tryAct, Action catchAct = null, int timeout = 50)
{
while (true) //loops until error or exception
{
Console.WriteLine(timeout); //For debugging
if (timeout-- < 0) throw new TimeoutException("Tryfor timed out"); //reduce timeout by 1, when it reaches 0 throw exception
try
{
tryAct();
break; // If the try action succeeds with no exception, exit loop
}
catch //If any exception is throw in the try action
{
catchAct?.Invoke(); //If an action has been passed in the catch action, evoke it, else do nothing
}
Thread.Sleep(100); //wait 100 ms and try the try action again
}
}
这在大多数情况下工作得很好,但如前所述,它有时表现得很奇怪,我真的无法理解。
经常出现的是方法跑通,可能失败2次才成功。然后成功后,它抛出它捕获的所有错误。
更经常发生的是它达到超时,这意味着它失败了(在这种情况下)50 次。
然后它不只是抛出超时错误,而是抛出它应该捕获的 50 个错误。
我的目标当然只是制作一个方法来完成我所描述的,但我真的很想了解它如何以及为什么抛出它捕获的所有这些错误。
根据您的评论,我看到您的某些操作包含断言,例如 Assert.AreEqual
。
当断言失败时,NUnit 会做两件事:
记录失败
它通过抛出异常来终止测试的执行。
如果捕获异常,则阻止了第二步...测试不会终止。但是第一步已经发生了……已经报错
您的解决方案是将所有断言移到操作之外,移到测试主体本身。例如,您可以断言没有抛出异常。在操作中,抛出一些其他类型的异常......一个简单的 System.Exception
就可以了。例如,代替 Assert.AreEqual(a, b)
,使用
if (a != b)
throw new Exception("A was not equal to B");
只是不要显式或通过 Assert 抛出任何 NUnit 异常。
我正在使用 C# 中的 Nunit 和 selenium 编写一些网络测试 我做了一个导致一些奇怪行为的方法。
方法的重点是尝试一些动作。
如果操作成功退出方法。
如果操作抛出异常,请等待 100 毫秒,然后重试。
如果操作已尝试超过某个超时整数,则抛出超时异常。
我还想添加一个选项,以便在操作引发异常时执行其他操作。
这是代码:
public void Tryfor(Action tryAct, Action catchAct = null, int timeout = 50)
{
while (true) //loops until error or exception
{
Console.WriteLine(timeout); //For debugging
if (timeout-- < 0) throw new TimeoutException("Tryfor timed out"); //reduce timeout by 1, when it reaches 0 throw exception
try
{
tryAct();
break; // If the try action succeeds with no exception, exit loop
}
catch //If any exception is throw in the try action
{
catchAct?.Invoke(); //If an action has been passed in the catch action, evoke it, else do nothing
}
Thread.Sleep(100); //wait 100 ms and try the try action again
}
}
这在大多数情况下工作得很好,但如前所述,它有时表现得很奇怪,我真的无法理解。
经常出现的是方法跑通,可能失败2次才成功。然后成功后,它抛出它捕获的所有错误。
更经常发生的是它达到超时,这意味着它失败了(在这种情况下)50 次。 然后它不只是抛出超时错误,而是抛出它应该捕获的 50 个错误。
我的目标当然只是制作一个方法来完成我所描述的,但我真的很想了解它如何以及为什么抛出它捕获的所有这些错误。
根据您的评论,我看到您的某些操作包含断言,例如 Assert.AreEqual
。
当断言失败时,NUnit 会做两件事:
记录失败
它通过抛出异常来终止测试的执行。
如果捕获异常,则阻止了第二步...测试不会终止。但是第一步已经发生了……已经报错
您的解决方案是将所有断言移到操作之外,移到测试主体本身。例如,您可以断言没有抛出异常。在操作中,抛出一些其他类型的异常......一个简单的 System.Exception
就可以了。例如,代替 Assert.AreEqual(a, b)
,使用
if (a != b)
throw new Exception("A was not equal to B");
只是不要显式或通过 Assert 抛出任何 NUnit 异常。