Ik zit mij een beetje zorgen te maken over hoe ik exceptions moet 'doorgeven'. Doorgeven is natuurlijk zowieso niet echt de bedoeling, maar ik moet deze exceptions toch opvangen, resources vrijgeven indien mogelijk en de gebruiker (het programma, de class, de methode) die gebruikmaakt van mijn API ervan verwittigen dat niet alles loopt zoals het zou moeten. Nu werkt deze API intern met onder andere sockets en je kan daar op praktisch iedere function call een exception krijgen. Uiteraard werken deze sockets op een andere thread.
Nu programmeer ik een beetje op de manier hoe de C#.NET Webclient ook is opgebouwd: ****Async methode die een thread start die zijn ding doet en door middel van event delegates zijn resultaten kan uitvoeren. Voor dingen zoals 'klaar zijn' en progress doorgeven is het duidelijk, want klaar zijn doe je als je gedaan hebt wat er verwacht wordt. Maar errors kunnen overal optreden, als ik dit, even snel in elkaar geflanste stukje code hebt:
Nu heb ik hier wel Code Complete 2 liggen, oom ook hierin wordt geen 'way to go' aangeven. Super boek is het, en heeft mij veel brainvoer bezorgt maar hierover kan ik vreemd genoeg niets vinden. Wat is volgens mijn mededevvers 'the way to go'?
Nu programmeer ik een beetje op de manier hoe de C#.NET Webclient ook is opgebouwd: ****Async methode die een thread start die zijn ding doet en door middel van event delegates zijn resultaten kan uitvoeren. Voor dingen zoals 'klaar zijn' en progress doorgeven is het duidelijk, want klaar zijn doe je als je gedaan hebt wat er verwacht wordt. Maar errors kunnen overal optreden, als ik dit, even snel in elkaar geflanste stukje code hebt:
C#:
Op verschillende function calls kan je hier exceptions krijgen, maar naar mijn gevoel is het niet netjes om op iedere functie een try-catch neer te zetten met in de catch een OnError() en eventueel in de catch nog een Socket.Close(). Beter is het lijkt me om op basis van de documentatie te bepalen of je een exception kan krijgen, maar dan nog heb je kan op veel try-catch blokken en ik heb onderbuikgevoelens dat zoiets niet netjes is.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPEndPoint iep = new IPEndPoint(IPAddress.Any, SpeedProtocol.BroadcastPort); sock.Bind(iep); EndPoint ep = iep; while ( !TimesUp() ) { //some function telling whether our time's up, just pseudocode byte[] data = new byte[4048]; int recv = sock.ReceiveFrom(data, ref ep); // deserialize the bytes to a Protocol packet BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); stream.Write(data, 0, data.Length); stream.Seek(0, 0); Protocol packet = (Protocol) formatter.Deserialize(stream); Protocol dummy; bool found = this.TaskList.TryGetValue(packet.ServerIpAddress, out dummy); if ( !found ) { this.TaskList.Add(packet.ServerIpAddress, packet); TaskEventArgs eventArgs = new TaskEventArgs(packet.ServerIpAddress, packet); this.OnBroadcastDiscovered(eventArgs); } // determine whether we need to cancel if ( this.CancellationRequested ) { sock.Shutdown(SocketShutdown.Receive); sock.Close(); this.OnTaskComplete(new TaskCompleteEventArgs(this.TaskList, true)); return; } // next } this.OnTaskComplete(new TaskCompleteEventArgs(this.ResultList)); // shut down socket and return sock.Shutdown(SocketShutdown.Both); sock.Close(); |
Nu heb ik hier wel Code Complete 2 liggen, oom ook hierin wordt geen 'way to go' aangeven. Super boek is het, en heeft mij veel brainvoer bezorgt maar hierover kan ik vreemd genoeg niets vinden. Wat is volgens mijn mededevvers 'the way to go'?
[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]