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(如果找不到匹配项)。