C# 带有Try-Catch的while循环在循环结束后抛出异常

C# 带有Try-Catch的while循环在循环结束后抛出异常,c#,selenium,loops,try-catch,nunit,C#,Selenium,Loops,Try Catch,Nunit,我正在使用Nunit和selenium在C中编写一些web测试# 我做了一个方法,导致了一些奇怪的行为 这个方法的要点是尝试一些动作 如果操作成功,请退出该方法 如果操作引发异常,请等待100毫秒,然后重试 如果尝试的操作超过某个超时整数,则引发超时异常 我还想添加一个选项,以便在操作引发异常时执行其他操作 代码如下: public void Tryfor(Action tryAct, Action catchAct = null, int timeout = 50) {

我正在使用Nunit和selenium在C中编写一些web测试# 我做了一个方法,导致了一些奇怪的行为

这个方法的要点是尝试一些动作

如果操作成功,请退出该方法

如果操作引发异常,请等待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
        }
    }
public void Tryfor(Action tryAct,Action catchAct=null,int timeout=50)
{
while(true)//循环直到出现错误或异常
{
Console.WriteLine(超时);//用于调试
if(timeout--<0)抛出新的TimeoutException(“Tryfor timed out”);//当超时达到0时,将超时减少1抛出异常
尝试
{
tryAct();
break;//如果try操作成功且没有异常,则退出循环
}
catch//如果在try操作中抛出任何异常
{
catchAct?.Invoke();//如果在catch操作中传递了一个操作,则调用它,否则不执行任何操作
}
Thread.Sleep(100);//等待100毫秒,然后重试该操作
}
}
这在大多数情况下都很管用,但正如前面提到的,它有时表现得很怪异,我真的无法理解

经常发生的情况是,该方法会运行一段时间,在成功之前可能会失败两次。然后在成功之后,它抛出它捕获的所有错误

更常见的情况是它达到了超时,这意味着它失败了(在本例中)50次。 然后,它不再抛出超时错误,而是抛出它应该捕获的50个错误


当然,我的目标只是创建一个符合我描述的方法,但我真的很想了解它如何以及为什么抛出它捕获的所有错误。

根据您的评论,我看到您的一些操作包括断言,例如
Assert.AreEqual

当断言失败时,NUnit会做两件事:

  • 它记录了失败

  • 它通过抛出异常来终止测试的执行

  • 如果捕捉到异常,将阻止第二步。。。测试不会终止。但是第一步已经开始了。。。故障已经报告

    在您的案例中,解决方案是将所有断言移到操作之外,移到测试体本身。例如,您可以断言没有引发异常。在操作中,抛出其他类型的异常。。。一个简单的
    系统。异常
    就可以了。例如,使用

    if (a != b)
        throw new Exception("A was not equal to B");
    

    只是不要显式地或通过断言抛出任何NUnit异常。

    您描述的情况是否总是在使用相同参数调用时发生?另外,您如何知道“它抛出了它应该捕获的50个错误”,因为如果捕获不正确,第一个抛出的错误应该停止程序?@Rafalon不,我使用它进行了几个不同的测试。例如,我有一个可以从日志中看到,它在通过测试之前尝试了13次,然后继续测试,一旦测试完成,它抛出了这13个异常。导致测试成功并报告为失败。我已经创建了一个.NET文件来处理您的代码,但它似乎没有相同的问题。我们需要更多关于参数是什么的信息失败了13次的参数只是这个动作传递给了方法:Assert.AreEqual(Activecheckbox.Selected,true);没有别的了。只是失败了几次,直到复选框加载到properlyOh wait中,您的意思是您正在将
    Assert
    s作为
    tryAct
    方法传递?这就像你在为(inti=0;i<50;i++)写
    {Assert.AreEqual(…,…);Thread.Sleep(100);}
    ,只是稍微尝试一下。请注意,在测试方法中,如果任何
    Assert
    s失败,则整个测试将失败。这是正常的行为,也不同于抛出的异常。我认为你应该在你的问题中包括你的测试方法,因为它会澄清很多