gpt4 book ai didi

c# - 来自回调 c# 的未处理异常错误

转载 作者:太空狗 更新时间:2023-10-29 20:29:05 25 4
gpt4 key购买 nike

我有一个 3 层架构,使用 tcp 套接字在传输层(TCP 客户端)发送一些数据,这种方法使用 BeginSend 方法异步进行。

public void TransportData(Stream stream)
{
try
{
SetTransporterState(StateObject.State.SendingData);
if (clientSock.Connected)
{
ASCIIEncoding asen = new ASCIIEncoding();
stream.Position = 0;
byte[] ba = GetStreamAsByteArray(stream);
if (clientSock.Connected)
clientSock.BeginSend(ba, 0, ba.Length, SocketFlags.None, new AyncCallback(SendData), clientSock);
else
throw new SockCommunicationException("Socket communication failed");

}
catch (SocketException sex)
{
throw sex;
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
}
}
catch (SocketException soex)
{
throw soex;
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
catch (Exception ex)
{
LoggingMessageHelper.LogDeveloperMessage(ex.Message + Environment.NewLine + ex.StackTrace, 1, TraceEventType.Critical);
bool rethrow = ExceptionPolicy.HandleException(ex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
}

回调代码SendData()如下

    private void SendData(IAsyncResult iar)
{
Socket remote = null;
try
{
remote = (Socket)iar.AsyncState;
try
{
int sent = remote.EndSend(iar);
}
catch (Exception ex)
{
throw ex;
}

if (remote.Connected )
{
remote.BeginReceive(data, 0, size, SocketFlags.None,
new AsyncCallback(ReceiveData), remote);
}
else
throw new SockCommunicationException("Communication Failed");
}
catch (SocketException soex)
{
throw new SockCommunicationException("Communication Failed");
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}

当服务器断开连接时,客户端直到它发送一些数据才知道,因此 Connected 属性为真。然后行 remote.BeginReceive() 抛出我 try catch 的 SocketException 并抛出自定义异常 (sockCommunicationException)。

然而,当我这样做时,我得到了一个未处理的异常。我想通过业务层将这个错误冒泡到用户界面。当在回调方法中抛出这样的异常时,它会抛到哪里?

如何避免这个未处理的异常并将这个异常冒泡到 UI 层。

请帮忙。

提前致谢!

最佳答案

是的,行不通。回调在线程池线程上执行,没有人可以捕获异常。例如,您需要引发 UI 可以订阅的事件。需要编码(marshal)处理,如果需要更新 UI,UI 代码需要使用类似 Control.BeginInvoke() 的东西。

关于c# - 来自回调 c# 的未处理异常错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4423146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com