Невозможно правильно обработать исключение в моем коде - PullRequest
1 голос
/ 21 июня 2019

Это небольшая процедура (я написал номера строк, так что будет легче сделать ссылку), которую я имею для передачи данных из моего настольного приложения на мое мобильное устройство. Он работает отлично, но я не могу правильно обработать исключения. если я пишу свой код, как показано ниже, обрабатывается исключение System.Net.Sockets.SocketException, но, поскольку клиент не может подключиться, поэтому следующая строка (17) создает исключение

System.InvalidOperationException: 'The operation is not allowed on non-connected sockets.

Теперь, если я пытаюсь поместить строки 17 и 18 в попытку, возникает другая ошибка, что поток становится локальным объектом, и из-за чего строка 24 выдает ошибку.

Если я объявляю поток в начале, то в строке 24

появляется другая ошибка.

ERROR :use of unassigned variable stream.

это своего рода тупик для меня, я не могу пройти через это. Заранее спасибо!!

 C#

1 void  BluetoothClientConnectCallback(IAsyncResult result)
2        {
3                BluetoothClient client = (BluetoothClient)result.AsyncState;
4                Stream stream;
5
6                try
7                {
8                    client.EndConnect(result);
9                }
10
11                catch (System.Net.Sockets.SocketException)
12                {
13                   MessageBox.Show("Unable to connect to device!", "Error", 
                     MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
14                    
15                }
16
17                stream = client.GetStream();
18                stream.ReadTimeout = 1000;
19                  while (true)
20                  {
21                      while (!ready) ;
23                      message = Encoding.ASCII.GetBytes("{");
24                      stream.Write(message, 0, 1);
25                      ready = false;
26   
27                  } 

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Хорошо, значит, ваша проблема try / catch не покрывает правильную область, должна выглядеть следующим образом:

void BluetoothClientConnectCallback(IAsyncResult result)
{       
    try
    {
        BluetoothClient client = (BluetoothClient)result.AsyncState;
        Stream stream;

        client.EndConnect(result);


        stream = client.GetStream();
        stream.ReadTimeout = 1000;
        while (true)
        {
            while (!ready) ;
            message = Encoding.ASCII.GetBytes("{");
            stream.Write(message, 0, 1);
            ready = false;

        }
    }

    catch (System.Net.Sockets.SocketException e)
    {
        MessageBox.Show($"Unable to connect to device with message:\r\n{e.Message}", "Error",
                   MessageBoxButtons.OKCancel, MessageBoxIcon.Error);

    }
    catch (Exception ex)
    {
        //general exception catch, handle or ignore, but best is to log
    }
}

Если вы хотите «скрыть» ошибку, вам нужно иметьпустой улов, но это никогда не рекомендуется

Возможно, необходимо некоторое чтение по try / catch, ознакомьтесь с здесь

Также стоит упомянуть, при использовании Streams передовой опытиспользовать using, чтобы убедиться, что он расположен правильно и не вызывает утечку памяти, например:

void BluetoothClientConnectCallback(IAsyncResult result)
{
    try
    {
        BluetoothClient client = (BluetoothClient)result.AsyncState;    
        client.EndConnect(result);
        using (var stream = client.GetStream())
        {
            stream.ReadTimeout = 1000;
            while (true)
            {
                while (!ready) ;
                message = Encoding.ASCII.GetBytes("{");
                stream.Write(message, 0, 1);
                ready = false;
            }
        }
    }

    catch (System.Net.Sockets.SocketException e)
    {
        MessageBox.Show($"Unable to connect to device with message:\r\n{e.Message}", "Error",
                   MessageBoxButtons.OKCancel, MessageBoxIcon.Error);    
    }
    catch (Exception ex)
    {
        //general exception catch, handle or ignore, but best is to log
    }
}

Также приведены некоторые советы по обработке исключений из другого сообщения SO здесь

1 голос
/ 21 июня 2019

Выполните все, что может вызвать исключения внутри блока try и catch любое исключение, которое, по вашему мнению, вы должны обработать.

void BluetoothClientConnectCallback(IAsyncResult result)
{
  BluetoothClient client = (BluetoothClient)result.AsyncState;
  Stream stream;

  try
  {
    client.EndConnect(result);
    stream = client.GetStream();
    stream.ReadTimeout = 1000;
    while (true)
    {
      while (!ready) ;
      message = Encoding.ASCII.GetBytes("{");
      stream.Write(message, 0, 1);
      ready = false;
    }
  }

  catch (System.Net.Sockets.SocketException)
  {
    MessageBox.Show("Unable to connect to device!", "Error",
    MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
  }
  catch (InvalidOperationException ex) 
  { 
     MessageBox.Show("Invalid operation exception!", "Error",
     MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
  }
  catch (Exception ex) 
  {
     MessageBox.Show("Exception thrown!", "Error",
     MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...