将try-catch放在循环中是不错的做法,直到try块中的所有语句都被执行而没有任何异常?

Anu*_*N C 8 c# sockets try-catch

我正在尝试开发多播接收器程序并完成套接字初始化,如下所示:

    public void initializeThread()
    {
        statuscheckthread = new Thread(SetSocketOptions);
        statuscheckthread.IsBackground = true;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        rxsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        iep = new IPEndPoint(IPAddress.Any, 9191);
        rxsock.Bind(iep);
        ep = (EndPoint)iep;

        initializeThread();
        statuscheckthread.Start();
    }

    public void SetSocketOptions()
    {
         initializeThread(); //re-initializes thread thus making it not alive
         while (true)
         {
             if (NetworkInterface.GetIsNetworkAvailable())
             {
                 bool sockOptnSet = false;
                 while (!sockOptnSet)
                 {
                     try
                     {
                         rxsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("224.50.50.50")));
                         rxsock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 64);
                         sockOptnSet = true;
                     }
                     catch
                     {
                         //Catch exception here
                     }
                 }
             }
             break; // Break out from loop once socket options are set
         }
     }
Run Code Online (Sandbox Code Playgroud)

当我的PC未连接到网络时,SetSocketOption方法抛出异常,即使连接了网络,我也无法接收数据,因为未设置套接字选项.

为了避免这种情况,我使用了一个在后台运行的线程来检查网络可用性,一旦网络可用,它就会设置套接字选项.

它在某些PC中正常工作,但在其他一些PC中,NetworkInterface.GetIsNetworkAvailable() 在网络连接之前返回true(在识别网络时).

因此,为了确保设置Socket选项,我使用了一个bool变量sockOptnSet ,该变量被设置为 true好像try块中的所有语句都被执行,如方法中所示public void SetSocketOptions() 这个程序在我试过的所有PC中都能正常工作,但我很怀疑我可以依靠多少工作.

我的问题是:

1)这是一个好习惯吗?

2)如果没有,可能导致的错误或问题是什么?我怎样才能以更好的方式实现它?

Han*_*ant 4

这是一个好的做法吗?

不,这不是一个好的做法。绝大多数异常,包括您的第一个异常,都属于令人烦恼的异常类别。软件应该可以工作,在测试时工作得很好,但在用户的机器上却不行。出现了问题,但您不知道问题出在哪里,而且对此您无能为力。试图让你的程序继续运行是没有用的,它无法完成它应该做的工作。就您而言,当没有网络时,套接字不可能接收数据。而且,正如您所发现的,试图解决问题只会带来更多问题。这很正常。

如果这是不好的做法,我怎样才能以更好的方式实施它?

你需要人类的帮助。用户必须设置机器才能提供有效的网络连接。这需要一个用户界面,你必须有一种方法告诉人们他需要做什么来解决你的问题。您可以根据需要使其变得复杂或简单。只需一条错误消息、Exception.Message 的逐字副本就足够了。为 AppDomain.CurrentDomain.UnhandledException 事件编写事件处理程序是一个非常好的(也是必需的)策略。Microsoft 花费了大量的精力来使异常消息尽可能清晰和有用,甚至以用户的母语为您本地化它们,您希望利用这一点。即使异常消息令人费解,对消息文本的快速 Google 查询也会返回数百个匹配结果。使用此事件处理程序后,您无需执行任何特殊操作。您的程序会自动终止,并且您的用户知道该怎么做。

你当然可以让它变得更复杂,你发现 SetSocketOption() 很容易在网络可用后立即失败,但当你等待足够长的时间时它就会工作。因此,这实际上是一个错误情况,您可以通过等待足够长的时间来解决。是否应该编写代码来处理这个问题需要您自己决定。当您对程序的行为方式有足够的经验时,您就可以编写它,而不是预先编写它。通常是程序用户反馈的结果。