请教异步操作异常抛出的问题

时间:2022-10-21 23:50:22
我在说socket异步通讯时,作个一个类自己用,但在使用的时候发现一下的问题,请教各位了:
这个时客户端连接方法:方法在beginConnect后回调Connected方法
  public virtual void Connect(string ip, int port)
        {

            Socket newsock = new Socket(AddressFamily.InterNetwork,
             SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Parse(ip), port);
            try
            {
                newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);
            }
            catch (ApplicationException EX)
            {
                throw (new ApplicationException("连接服务器失败!"));
            }

        }
在Connected方法中实现如下:
    protected virtual void Connected(IAsyncResult iar)
        {

            Socket socket = (Socket)iar.AsyncState;
            try
            {
                socket.EndConnect(iar);
            }
            catch
            {
                throw new ApplicationException("连接失败");
            }
            //创建新的会话
            _session = new Session(socket);
            _isConnected = true;
            //触发连接建立事件
            if (ConnectedServer != null)
            {
                ConnectedServer(this, new NetEventArgs(_session));
            }
            //建立连接后应该立即接收数据
            _session.ClientSocket.BeginReceive(_recvDataBuffer, 0,
             DefaultBufferSize, SocketFlags.None,
             new AsyncCallback(RecvData), socket);
        }
在socket.EndConnect(iar)处捕捉异常,也就是如果连不上服务器的话,这个地方抛出异常。
应用程序中:
             try
            {
               m_TcpCli.Connect(m_strServerIp, m_iPortNum);  
            }
            catch(Exception exx)
            {
                MessageBox.Show(exx.Message);
                return;
            }
但在程序运行过程中,不启动服务器而启动客户机连接,并没有捕获到那个socket.EndConnect(iar)处抛出的异常,平且显示如图:
[img=https://mail.google.com/mail/?ui=2&ik=8e97f730b7&view=att&th=11cc5984e58aa0b2&attid=0.1][/img]
这是为什么,向大家学习学习。谢谢啦

13 个解决方案

#1


看不到图...

#2


[img=https://mail.google.com/mail/?ui=2&ik=8e97f730b7&view=att&th=11cc5f2db970c8b9&attid=0.2][/img]

#3


图不知道怎么搞的贴不上去,就是在
    try 
            { 
                socket.EndConnect(iar); 
            } 
            catch 
            { 
                throw new ApplicationException("连接失败"); 
            } 
处报错,显示“为处理ApplicationException”

#4


关注

#5


请教异步操作异常抛出的问题

#6


[img=http://album.hi.csdn.net/app_uploads/jesenhq/20081004/115714194.p.JPG?d=20081004115812441][/img]

#7


异步方法和普通方法的区别在于调用该方法后,该方法并不会阻塞当前线程,而是使用新线程来处理,因此当你调用该方法时,在调用后立即执行之后的代码。

如下面这段例子:
try
            {
                //这个方法一调用后立即执行catch,除非传递的参数有误,否则将捕捉不到错误。
                newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);     
            }
            catch (ApplicationException EX)
            {
                throw (new ApplicationException("连接服务器失败!"));
            } 

#8


问题是异步通讯的时候,当服务器没有打开时,BeginConnect()好像不能检测到连接失败,只能在异步调用函数Connected中的socket.EndConnect(iar); 
这报错。怎么才能捕获这个异常呢?

#9


异步的错误,一般在End方法处抛出。因此处理错误的打法应该是:
try
{
    //如果BeginMethod方法中存在错误,则调用本方法时,将会执出BeginMethod中的错误
    xxx.EndMethod(param);
}
catch (Exception ex)
{
    //thorw your Exception
    ....
}

#10


这个我明白,beginConnect的错是在endConnect中报错,现在是这个endConnect是在另一个异步方法中调用的,怎么能让这个错抛出来

#11


引用 8 楼 jesenhq 的回复:
问题是异步通讯的时候,当服务器没有打开时,BeginConnect()好像不能检测到连接失败,只能在异步调用函数Connected中的socket.EndConnect(iar);
这报错。怎么才能捕获这个异常呢?


在End方法捕获就行。
异步的概念就是调用的方法并不会阻塞当前线程,如果它阻塞了,那也不是异步了。

#12


引用 10 楼 jesenhq 的回复:
这个我明白,beginConnect的错是在endConnect中报错,现在是这个endConnect是在另一个异步方法中调用的,怎么能让这个错抛出来


你可以在调用endConnect的方法中捕捉再抛出这个错误。
或者
可以定义一个ConnectError事件,在出现错误时,引发此事件。

#13


谢谢kssys,我做了个ConnectError事件,可行。感谢Kssys的帮助

#1


看不到图...

#2


[img=https://mail.google.com/mail/?ui=2&ik=8e97f730b7&view=att&th=11cc5f2db970c8b9&attid=0.2][/img]

#3


图不知道怎么搞的贴不上去,就是在
    try 
            { 
                socket.EndConnect(iar); 
            } 
            catch 
            { 
                throw new ApplicationException("连接失败"); 
            } 
处报错,显示“为处理ApplicationException”

#4


关注

#5


请教异步操作异常抛出的问题

#6


[img=http://album.hi.csdn.net/app_uploads/jesenhq/20081004/115714194.p.JPG?d=20081004115812441][/img]

#7


异步方法和普通方法的区别在于调用该方法后,该方法并不会阻塞当前线程,而是使用新线程来处理,因此当你调用该方法时,在调用后立即执行之后的代码。

如下面这段例子:
try
            {
                //这个方法一调用后立即执行catch,除非传递的参数有误,否则将捕捉不到错误。
                newsock.BeginConnect(iep, new AsyncCallback(Connected), newsock);     
            }
            catch (ApplicationException EX)
            {
                throw (new ApplicationException("连接服务器失败!"));
            } 

#8


问题是异步通讯的时候,当服务器没有打开时,BeginConnect()好像不能检测到连接失败,只能在异步调用函数Connected中的socket.EndConnect(iar); 
这报错。怎么才能捕获这个异常呢?

#9


异步的错误,一般在End方法处抛出。因此处理错误的打法应该是:
try
{
    //如果BeginMethod方法中存在错误,则调用本方法时,将会执出BeginMethod中的错误
    xxx.EndMethod(param);
}
catch (Exception ex)
{
    //thorw your Exception
    ....
}

#10


这个我明白,beginConnect的错是在endConnect中报错,现在是这个endConnect是在另一个异步方法中调用的,怎么能让这个错抛出来

#11


引用 8 楼 jesenhq 的回复:
问题是异步通讯的时候,当服务器没有打开时,BeginConnect()好像不能检测到连接失败,只能在异步调用函数Connected中的socket.EndConnect(iar);
这报错。怎么才能捕获这个异常呢?


在End方法捕获就行。
异步的概念就是调用的方法并不会阻塞当前线程,如果它阻塞了,那也不是异步了。

#12


引用 10 楼 jesenhq 的回复:
这个我明白,beginConnect的错是在endConnect中报错,现在是这个endConnect是在另一个异步方法中调用的,怎么能让这个错抛出来


你可以在调用endConnect的方法中捕捉再抛出这个错误。
或者
可以定义一个ConnectError事件,在出现错误时,引发此事件。

#13


谢谢kssys,我做了个ConnectError事件,可行。感谢Kssys的帮助

相关文章