Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何区分书写异常和阅读异常?_C#_Sockets_Exception_Ioexception - Fatal编程技术网

C# 如何区分书写异常和阅读异常?

C# 如何区分书写异常和阅读异常?,c#,sockets,exception,ioexception,C#,Sockets,Exception,Ioexception,我有一个套接字,我想发送消息并从中读取 当我在另一端脱机时使用套接字读/写时,我得到相同的异常:System.IO.IOException:无法从传输连接读取数据:非阻塞套接字上的操作将阻塞 除了有两个单独的try-catch块外,我如何识别这两个块中发生的是哪一个?当读取超时结束时,我不能得到一个超时异常吗 例如: try { SendData("!GetLocation!"); string data = GetData(); } catch (Exception ex) {

我有一个套接字,我想发送消息并从中读取

当我在另一端脱机时使用套接字读/写时,我得到相同的异常:
System.IO.IOException:无法从传输连接读取数据:非阻塞套接字上的操作将阻塞

除了有两个单独的try-catch块外,我如何识别这两个块中发生的是哪一个?当读取超时结束时,我不能得到一个
超时异常吗

例如:

try
{
    SendData("!GetLocation!");
    string data = GetData();
}
catch (Exception ex)
{
    if (ex is System.IO.IOException)
        {
            //How can I identify if the exception was raised at the read method or the write method?
        }
}

是的,异常处理需要大量的资源,但有时也没那么糟糕

如果只使用一个try-catch,则可以检查错误消息

注意:我还为泛型(非IO)错误添加了第二个try-catch

您还可以设置一个布尔变量并检查其值,以了解其位置 破坏了你的密码

bool sendCalled = false;

try
{
    SendData("!GetLocation!");
    sendCalled = true;
    string data = GetData();
}
catch (System.IO.IOException ex)
{
    if (sendCalled)
    {
     // GetData error
    }
    else
    {
     // SendData error
    }
}

是的,异常处理需要大量的资源,但有时也没那么糟糕

如果只使用一个try-catch,则可以检查错误消息

注意:我还为泛型(非IO)错误添加了第二个try-catch

您还可以设置一个布尔变量并检查其值,以了解其位置 破坏了你的密码

bool sendCalled = false;

try
{
    SendData("!GetLocation!");
    sendCalled = true;
    string data = GetData();
}
catch (System.IO.IOException ex)
{
    if (sendCalled)
    {
     // GetData error
    }
    else
    {
     // SendData error
    }
}

并不是说我支持这两种解决方案中的任何一种,但答案是:你可以任意选择

  • 分析异常的堆栈跟踪,找出哪个调用失败(例如堆栈框架顶部的方法名称)
  • 在写入之后设置一个标志,并基于该标志执行逻辑

这两种方法都不如包装每个方法调用那么简单。事实上,包装每个调用都传达了您的意图。在第一次调用的
catch
中,您可以返回/中断/跳过read调用,这明确地告诉读者您正在快速摆脱困境。

并不是说我支持这两种解决方案中的任何一种,而是回答:y你也可以

  • 分析异常的堆栈跟踪,找出哪个调用失败(例如堆栈框架顶部的方法名称)
  • 在写入之后设置一个标志,并基于该标志执行逻辑

这两种方法都不如包装每个方法调用那么简单。事实上,包装每个调用都传达了您的意图。在第一次调用的
catch
中,您可以返回/中断/跳过read调用,这明确地告诉读者您正在快速摆脱困境。

您所说的“这两个调用中的哪一个发生了”是什么意思?为什么你没有两个单独的try-catch块呢?我可以,但这看起来不太好。我只是想进一步理解,我没有说没有它我就不行。一个问题是你是否需要知道是哪一个抛出了异常。你会做些不同的事情吗?如果你确实需要区分这两个,那么就分开try/catch这是一个不错的选择。此外,一次尝试就可以获得多个捕获,而不是
if
。首先捕获
IoException
,然后如果需要捕获更一般的异常,则捕获
Exception
。通常我们需要的比我们想象的要少。有时我们不需要在方法中进行任何尝试/捕获,也不需要在oute中进行异常处理r方法就足够了。你所说的“这两种方法中的哪一种发生的”是什么意思?为什么你没有两个单独的try-catch块呢?我可以,但这看起来不太好。我只是想进一步理解,我没有说没有它我就不行。一个问题是你是否需要知道是哪一个抛出了异常。你会做些不同的事情吗?如果你确实需要区分这两个,那么就分开try/catch这是一个不错的选择。此外,一次尝试就可以获得多个捕获,而不是
if
。首先捕获
IoException
,然后如果需要捕获更一般的异常,则捕获
Exception
。通常我们需要的比我们想象的要少。有时我们不需要在方法中进行任何尝试/捕获,也不需要在oute中进行异常处理r方法就足够了。更正:您没有将
ex.Message.IndexOf(…)
的结果与value.beauty进行比较。非常感谢。请再说一件事-如果read函数超过给定的recieve TimeOut,为什么我不能引发超时异常?另外,我想得到一个关于
ex.Message.IndexOf(…)比较的解释
-1
。将
索引of
与-1进行比较基本上是说“主题字符串不包含指定的子字符串”。您也可以执行
!ex.Message.Contains(…)
,更现代、更可读。@DanielReyhanian String.IndexOf(如果找不到匹配项)。更正:您没有比较
ex.Message.IndexOf(…)的结果
到一个值。很漂亮。非常感谢。请再说一件事-如果读取函数超过给定的接收超时,为什么我不能引发超时异常?另外,我想得到一个关于将
ex.Message.IndexOf(…)
-1
进行比较的解释。将
IndexOf
与-1进行比较基本上是说“主题字符串不包含指定的子字符串”。您还可以执行
!ex.Message.Contains(…)
,这更现代、更可读。@DanielReyhanian string.IndexOf(如果找不到匹配项)。