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