У меня трехуровневая архитектура, и я отправляю некоторые данные на транспортном уровне (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 () приведен ниже1004 *
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 имеет значение true.Затем строка remote.BeginReceive () генерирует исключение SocketException, которое я пытаюсь перехватить, и выбрасывает пользовательское исключение (sockCommunicationException).
Однако, когда я делаю это, я получаю необработанное исключение.Я хотел бы передать эту ошибку пользовательскому интерфейсу через бизнес-уровень.Когда подобное исключение вызывается в методе обратного вызова, где оно поднимается до?
Как можно избежать этого необработанного исключения и передать это исключение на уровень пользовательского интерфейса.
Пожалуйста, помогите.
Заранее спасибо!