在循环或子方法中退出 void 方法的最佳实践?

Best practices for exiting a void method within a loop or submethod?

我正在尝试找出从方法内部的另一个子方法中立即退出该方法的最佳方法。我知道我可以抛出异常但是我已经在该方法中有一个 try catch 可以捕获我抛出的任何异常。我基本上是在尝试执行两次操作,例如对服务器执行 ping 操作,如果第一次失败,捕获异常并重试,但如果第二次失败,则退出整个方法。我可以实施 Initialize().Exit() 吗?从异常中抛出异常似乎不是最好的方法。如果初始 ping 失败或出现错误,我想捕获,因为有时 ping 会失败,如果它执行其中任何一个,我会处理尝试连接到另一台服务器(未显示)。

public main()
{
    bool pingedOnce = false;
    try {
    Initialize();
    }
    catch (Exception e)
    {
        Console.WriteLine("e");
    }
}

public void Initialize()
{        
        try
        {

            if (new Ping().Send(server).Status == IPStatus.Success) //pings server to see if it exists
            {
                Console.WriteLine("Successfully Pinged " + server);
            }
            else
                throw new System.Exception();
        }
        catch (Exception e)
        {
            if (!pingedOnce)) //see if server has been pinged before
            {
                pingedOnce = True;
                Console.WriteLine("WARNING: failed to get data from server attempting to reconnect...");
                ReconnectToServer(server);
            }
            else
                throw new System.Exception("ERROR: Failed to connect to server after re-attempt.");
        }
}

类似问题的另一个例子:

public Main()
{
    Initialize();
}
public void Initialize()
{
    foreach(string s in serverIPList)
    {
        for (int i=0; i<5; i++;)
        {
            if (new Ping().Send(serverIPList[i]).Status == IPStatus.Success) //when it finds a server that it successfully pings, it exits the method
                Initialize().Exit(); //I want this to exit this for loop, the foreach loop, and the initialize method entirely.
        }
    }
}

理论上我可以不选择做一个 void 方法,只是让它 return null 并且从不将方法分配给任何东西,但这是比嵌套的 try catch 更好的做法吗?

如果你有异常抛出。否则 return!

if (new Ping().Send(server).Status == IPStatus.Success) //pings server to see if it exists
            {
                Console.WriteLine("Successfully Pinged " + server);
return; //RETURN here if you dont want to do anything!
            }
            else
                throw new System.Exception();

无论在哪里都一样。因此,您可以在发生异常时捕获异常,或者方法将在您想要的地方停止。

如果您想坚持您的异常处理设计,建议您创建一个派生自 System.Exception 的自定义 class。你几乎不应该抛出 System.Exception;而是抛出一个更专业的异常,这使您能够以不同的方式捕获和处理每种类型的异常。例如:

    try
    {
        // this can throw different kinds of exceptions.
    }
    catch (InvalidOperationException e)
    {
        // do something.
    }
    catch (ArgumentException e)
    {
        // do something different.
    }