Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
March 26, 2017 Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
How do you catch an std.socket.SocketOSException? The following does not work, as the exception occurs anyway and leads to a crash: >import ae.net.asockets; > >void main(string[] args) >{ > TcpServer tcp = new TcpServer(); > > try > { > tcp.listen(2345, "127.0.0.1c"); > // '...c' makes the IP address invalid > } > catch (std.socket.SocketOSException e) > { > return; > } > catch (Exception e) > { > return; > } > > socketManager.loop(); >} Output: >std.socket.SocketOSException@std\socket.d(975): getaddrinfo error: Unknown Host |
March 26, 2017 Re: Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jolly James | On Sunday, 26 March 2017 at 00:34:03 UTC, Jolly James wrote: > How do you catch an std.socket.SocketOSException? > > > The following does not work, as the exception occurs anyway and leads to a crash: > >>import ae.net.asockets; >> >>void main(string[] args) >>{ >> TcpServer tcp = new TcpServer(); >> >> try >> { >> tcp.listen(2345, "127.0.0.1c"); >> // '...c' makes the IP address invalid >> } >> catch (std.socket.SocketOSException e) >> { >> return; >> } >> catch (Exception e) >> { >> return; >> } >> >> socketManager.loop(); >>} > > Output: >>std.socket.SocketOSException@std\socket.d(975): getaddrinfo error: Unknown Host This part: catch (std.socket.SocketOSException e) > { > return; > } Is redundant, because SocketOSException inherits SocketException which inherits Exception. It should already be caught by catch (Exception e) You should have a full stacktrace, chances are that it's invoked in your loop()? |
March 26, 2017 Re: Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
Posted in reply to bauss | On Sunday, 26 March 2017 at 01:22:24 UTC, bauss wrote: > On Sunday, 26 March 2017 at 00:34:03 UTC, Jolly James wrote: >>>[...] > > This part: > catch (std.socket.SocketOSException e) >>[...] > > [...] I know that inheritance stuff, but none (!) of them catches that strange exception either. You can ignore the loop()-method. It is not called as the application will never reach this statement, because it cannot, because it crashes already in the listen()-method in consequence of the exception that does not get caught by the try-catch block. >std.socket.SocketOSException@std\socket.d(975): getaddrinfo error: Unknow host. >---------------- > 0x004205BE in pure @safe bool std.exception.enforce!(bool).enforce(bool, lazy object.Throwable) > 0x0040D3A2 in @trusted std.socket.AddressInfo[] std.socket.getAddressInfo!(immutable(char)[], std.socket.AddressInfoFlags, std.socket.SocketType, std.socket.ProtocolType).getAddressInfo(const(char[]), immutable(char)[], std.socket.AddressInfoFlags, std.socket.SocketType, std.socket.ProtocolType).__lambda7() > 0x0040D37B in @safe std.socket.AddressInfo[] std.socket.getAddressInfo!(immutable(char)[], std.socket.AddressInfoFlags, std.socket.SocketType, std.socket.ProtocolType).getAddressInfo(const(char[]), immutable(char)[], std.socket.AddressInfoFlags, std.socket.SocketType, std.socket.ProtocolType) at C:\dlang\dmd2\windows\bin\..\..\src\phobos\std\socket.d(945) > 0x00404DAF in ushort ae.net.asockets.TcpServer.listen(ushort, immutable(char)[]) at C:\Users\jolly\src\ae\net\asockets.d(1242) > 0x00416749 in _Dmain at C:\Users\jolly\src\app.d(48) > 0x00423597 in D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv > 0x0042355B in void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll() > 0x0042345C in _d_run_main > 0x00417D74 in main at C:\Users\jolly\src\ae\net\asockets.d(7) > 0x00443EBD in mainCRTStartup > 0x757362C4 in BaseThreadInitThunk > 0x773C0FD9 in RtlSubscribeWnfStateChangeNotification > 0x773C0FA4 in RtlSubscribeWnfStateChangeNotification ↑ stacktrace |
March 26, 2017 Re: Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jolly James | On Sunday, 26 March 2017 at 02:24:56 UTC, Jolly James wrote:
> You can ignore the loop()-method. It is not called as the application will never reach this statement, because it cannot, because it crashes already in the listen()-method in consequence of the exception that does not get caught by the try-catch block.
Try putting it in the try anyway and see what happens.
It is an async socket library, they can do weird things.\
|
March 26, 2017 Re: Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Sunday, 26 March 2017 at 02:41:46 UTC, Adam D. Ruppe wrote:
> On Sunday, 26 March 2017 at 02:24:56 UTC, Jolly James wrote:
>> You can ignore the loop()-method. It is not called as the application will never reach this statement, because it cannot, because it crashes already in the listen()-method in consequence of the exception that does not get caught by the try-catch block.
>
> Try putting it in the try anyway and see what happens.
>
> It is an async socket library, they can do weird things.\
Unfortunately not working either. I should not forget to mention that the exception also raises when the code does not contain the loop()-call.
|
March 26, 2017 Re: Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jolly James | On Sunday, 26 March 2017 at 11:35:00 UTC, Jolly James wrote: > On Sunday, 26 March 2017 at 02:41:46 UTC, Adam D. Ruppe wrote: >> On Sunday, 26 March 2017 at 02:24:56 UTC, Jolly James wrote: >>> You can ignore the loop()-method. It is not called as the application will never reach this statement, because it cannot, because it crashes already in the listen()-method in consequence of the exception that does not get caught by the try-catch block. >> >> Try putting it in the try anyway and see what happens. >> >> It is an async socket library, they can do weird things.\ > > Unfortunately not working either. I should not forget to mention that the exception also raises when the code does not contain the loop()-call. Found out something: You cannot catch any exception thrown in the listen()-method in general. ■ Original code: >auto addressInfos = getAddressInfo(addr, to!string(port), AddressInfoFlags.PASSIVE, SocketType.STREAM, ProtocolType.TCP); ■ Modified one: >AddressInfo[] addressInfos; > >try >{ > addressInfos = getAddressInfo(addr, to!string(port), AddressInfoFlags.PASSIVE, SocketType.STREAM, ProtocolType.TCP); >} >catch(SocketOSException e) >{ > throw new Exception("Invalid address: " ~ addr, e); >} ■ Not working try-catch: > try > { > tcp.listen(2345, "127.0.0.1c"); > socketManager.loop(); > } > catch (Exception e) > { > return; > } |
March 26, 2017 Re: Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jolly James | On Sunday, 26 March 2017 at 11:46:39 UTC, Jolly James wrote:
> On Sunday, 26 March 2017 at 11:35:00 UTC, Jolly James wrote:
>> [...]
>
> Found out something: You cannot catch any exception thrown in the listen()-method in general.
>
>
> ■ Original code:
>>[...]
>
>
> ■ Modified one:
>>[...]
>
>
> ■ Not working try-catch:
>>[...]
Chances are it's invoked in another thread and thus you can't catch it like that.
To sum it up.
Ex.
void thisFunctionThrows() { ... }
void ableToCatch() {
try {
thisFunctionThrows();
}
catch (Exception e) {
// We can catch the exception ...
}
}
void notAbleToCatch() {
try {
spawn(&thisFunctionThrows);
}
catch (Exception e) {
// We cannot catch the exception ...
}
}
void ableToCatchToo() {
spawn(&ableToCatch); // We're able to handle the exception, because the try/catch is handled in the thread that calls the function that throws.
}
|
March 26, 2017 Re: Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
Posted in reply to bauss | On Sunday, 26 March 2017 at 18:50:13 UTC, bauss wrote: > On Sunday, 26 March 2017 at 11:46:39 UTC, Jolly James wrote: >>>[...] > > Chances are it's invoked in another thread and thus you can't catch it like that. > > To sum it up. > > Ex. > > void thisFunctionThrows() { ... } > > void ableToCatch() { > try { > thisFunctionThrows(); > } > catch (Exception e) { > // We can catch the exception ... > } > } > > void notAbleToCatch() { > try { > spawn(&thisFunctionThrows); > } > catch (Exception e) { > // We cannot catch the exception ... > } > } > > void ableToCatchToo() { > spawn(&ableToCatch); // We're able to handle the exception, because the try/catch is handled in the thread that calls the function that throws. > } If you want try to help me, mabye this helps you: https://github.com/CyberShadow/ae/blob/master/net/asockets.d#L1237 |
March 27, 2017 Re: Howto catch SocketOSException? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jolly James | On Sunday, 26 March 2017 at 21:57:29 UTC, Jolly James wrote:
> On Sunday, 26 March 2017 at 18:50:13 UTC, bauss wrote:
>> [...]
>
> If you want try to help me, mabye this helps you:
> https://github.com/CyberShadow/ae/blob/master/net/asockets.d#L1237
Finally found the bug: I had a logical error in the way how I used this code.
|
Copyright © 1999-2021 by the D Language Foundation