<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>.NET Framework</title><link>https://www.dotnetzone.gr:443/cs/forums/14/ShowForum.aspx</link><description>Θέματα για threading, remoting, reflection, exception handling, security, regex κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Δεν δουλεύει το RETURN στην Fınally του try ... catch</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/48827.aspx</link><pubDate>Tue, 03 Mar 2009 15:49:32 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:48827</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/48827.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=48827</wfw:commentRss><description>Να συμφωνήσω και εγώ με τα παραπάνω, σημειώνοντας οτι αυτά που λέει ο Παναγιώτης  είναι ουσιαστικά η extended version αυτού που είπα (και αυτών που παρέλειψα). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description></item><item><title>Απ: Δεν δουλεύει το RETURN στην Fınally του try ... catch</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/48818.aspx</link><pubDate>Tue, 03 Mar 2009 07:56:30 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:48818</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/48818.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=48818</wfw:commentRss><description>&lt;P&gt;Πράγματι, δεν επιτρέπεται να βγεις από ένα Finally με Return&amp;nbsp;ή GoTo. Αν το σκεφτείς, το finally υπάρχει μόνο και μόνο για να καθαρίσεις τυχόν αλλαγές που έχεις κάνει ακόμα και αν έχει εμφανιστεί exception. Αν σου επιτρεπόταν να βγεις με return ή GoTo, ακόμα και σε περίπτωση που έχει ήδη εμφανιστεί exception, θα μπορούσες να γράψεις εξαιρετικά επικίνδυνο κώδικα. Όπως σου λέει και ο Σωτήρης, μπορείς πολύ απλά να εκτελέσεις τη Return μετά το End Try και να ξεφορτωθείς την Finally.&lt;/P&gt;
&lt;P&gt;Ακόμα και έτσι όμως, αυτό που προσπαθείς να κάνεις είναι εξαιρετικά επικίνδυνο. Είναι πολύ κακή ιδέα να κουκουλώνεις ένα exception και να επιστρέφεις true/false. Πολύ απλά, αυτός που καλεί το function σου μπορεί να ξεχάσει να ελέγξει το αποτέλεσμα και να συνεχίσει να δουλεύει χρησιμοποιώντας π.χ. λανθασμένα δεδομένα, ή να προσπαθήσει να χρησιμοποιήσει κάποιο πίνακα ο οποίος είναι άδειος. &lt;/P&gt;
&lt;P&gt;Είναι σαν να "διορθώνεις" μία καμένη ασφάλεια τυλίγοντας την με ... αλουμινόχαρτο. Έχω δει χρηματιστηριακή εφαρμογή που χρησιμοποιούσε τέτοια κολπάκια. Κάποια στιγμή, άρχισαν να εμφανίζονται μηδενικά υπόλοιπα σε κάποιους λογαριασμούς. Ψάχνοντας, βρήκα ότι η συνάρτηση που επέστρεφε τις ισοτιμίες νομισμάτων σε κάποιες ημερομηνίες επέστρεφε 0. Βλέπεις, όποιος έφτιαξε τη συνάρτηση ξέχασε να ελέγξει τί του επέστρεφε η αντίστοιχη συνάρτηση του data layer η οποία ... επέστρεφε false σε περίπτωση λάθους. &lt;/P&gt;
&lt;P&gt;Ο σωστός τρόπος να χειρίζεσαι σφάλματα και exceptions είναι να τα χειρίζεσαι αν μπορείς, αλλιώς να τα αφήσεις να προχωρήσουν στις παραπάνω συναρτήσεις, μέχρι να βρεθεί κάποια συνάρτηση που θα μπορέσει να τα χειριστεί. Φαντάσου, για παράδειγμα, ότι έχεις τις παρακάτω συναρτήσεις:&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;void&lt;/SPAN&gt; TransferMoney(Account a, Account b,&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;decimal&lt;/SPAN&gt; amount)&lt;BR&gt;{&lt;BR&gt;Widthraw(a,amount);&lt;BR&gt;Deposit(b,amount);&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;void&lt;/SPAN&gt; Withdraw(Account a, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;decimal&lt;/SPAN&gt; amount)&lt;BR&gt;{&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;void&lt;/SPAN&gt; Deposit(Account a, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;decimal&lt;/SPAN&gt; amount)&lt;BR&gt;{&lt;BR&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;FONT size=2 face=Tahoma&gt;Για λόγους ευκολίας, ας υποθέσουμε ότι μόνο η Deposit μπορεί να εμφανίσει exception. Φαντάσου ότι κάποιο exception εμφανίζεται μέσα στην Deposit. Μπορεί η Deposit να αντιμετωπίσει την κατάσταση? Μάλλον όχι. Μπορεί μεν να ακυρώσει την κατάθεση των χρημάτων στο λογαριασμό Β αλλά δεν μπορεί να ακυρώσει την ανάληψη από το λογαριασμό Α. Συνεπώς, θα πρέπει το exception να πιαστεί μέσα στην TransferMoney για να ακυρωθεί η ανάληψη από τον Α. Και επειδή η ακύρωση μίας μεταφοράς χρημάτων είναι σημαντικό πρόβλημα, θα πρέπει να ξαναριχτεί το exception για να ειδοποιηθεί όποιος ξεκίνησε τη συναλλαγή ότι κάτι πήγε στραβά. Θα πρέπει δηλαδή να γραφτεί κάτι σαν αυτό:&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:black;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;void&lt;/SPAN&gt; TransferMoney(Account a, Account b,&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;decimal&lt;/SPAN&gt; amount)&lt;BR&gt;{&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;try&lt;/SPAN&gt;&lt;BR&gt;{&lt;BR&gt;Widthraw(a,amount);&lt;BR&gt;Deposit(b,amount);&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;catch&lt;/SPAN&gt;(Exception ex)&lt;BR&gt;{&lt;BR&gt;Deposit(a,amount);&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;throw&lt;/SPAN&gt;;&lt;BR&gt;}&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;void&lt;/SPAN&gt; Withdraw(Account a, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;decimal&lt;/SPAN&gt; amount)&lt;BR&gt;{&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;void&lt;/SPAN&gt; Deposit(Account a, &lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;decimal&lt;/SPAN&gt; amount)&lt;BR&gt;{&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;try&lt;/SPAN&gt;&lt;BR&gt;{&lt;BR&gt;....&lt;BR&gt;}&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;catch&lt;/SPAN&gt;(Exception ex)&lt;BR&gt;{&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:green;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;//Cancel Deposit&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="BACKGROUND-COLOR:transparent;FONT-FAMILY:Courier New;COLOR:blue;FONT-SIZE:11px;FONT-WEIGHT:normal;"&gt;throw&lt;/SPAN&gt;;&lt;BR&gt;}&lt;BR&gt;}&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;</description></item><item><title>Απ: Δεν δουλεύει το RETURN στην Fınally του try ... catch</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/48807.aspx</link><pubDate>Mon, 02 Mar 2009 19:34:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:48807</guid><dc:creator>cap</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/48807.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=48807</wfw:commentRss><description>Από ο,τι φαίνεται στο catch δεν θέλεις να κάνεις rethrow το exception (οπου σε αυτή την περίπτωση δεν θα είχε νόημα ούτως η άλλως το return) αλλά θέλεις να δώσεις μια τιμή στη μεταβλητή succeed. Μπορείς λοιπόν να δώσεις Succeed = false εντός του catch block και φυσικά η εκτέλεση του προγράμματος θα συνεχιστεί, εφόσον δεν κάνεις rethrow το exception.&lt;br /&gt;&lt;br /&gt;Επειτα, μπορείς μετά το end try να κάνεις return Succeed με ό,τι τιμή έχει πάρει. Ετσι θα έχεις είτε true (δεν μπήκε στο catch block) είτε false (επειδή μπήκε στο catch block).&lt;br /&gt;&lt;br /&gt;</description></item><item><title>Δεν δουλεύει το RETURN στην Fınally του try ... catch</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/48806.aspx</link><pubDate>Mon, 02 Mar 2009 19:00:44 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:48806</guid><dc:creator>Ηλίας Κεκάκος</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/48806.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=14&amp;PostID=48806</wfw:commentRss><description>Γειά σας και καλή Σαρακοστή,&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Dim&lt;/span&gt; Succeed &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Boolean&lt;/span&gt; &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;False&lt;/span&gt;&lt;br&gt;      &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Try&lt;/span&gt;&lt;br&gt;         DatasetUser &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; GetUser()&lt;br&gt;&lt;br&gt;         &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt; DatasetUser IsNot &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Nothing&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Then&lt;/span&gt;&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt; DatasetUser.Tables.&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Count&lt;/span&gt; &amp;gt; 0 &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Then&lt;/span&gt;&lt;br&gt;               Succeed &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;True&lt;/span&gt;&lt;br&gt;            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt;&lt;br&gt;         &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;If&lt;/span&gt;&lt;br&gt;      &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Catch&lt;/span&gt; ex &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;As&lt;/span&gt; Exception&lt;br&gt;&lt;br&gt;      &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Finally&lt;/span&gt;&lt;br&gt;        &lt;u&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Return&lt;/span&gt; Succeed&lt;/u&gt;&lt;br&gt;      &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Try&lt;/span&gt;&lt;br&gt;     &lt;/span&gt;&lt;br&gt;Αυτό όμως μου επιστρέφει το εξής error: &lt;font color="#0000ff"&gt;&lt;b&gt;Branching out of a 'Finally' is not valid&lt;/b&gt;&lt;/font&gt;.&lt;br&gt;Κόλησα, μπορεί να μου πεί κάποιος πως θα επιστρέψω την μεταβλητή είτε περάσει από το catch είτε όχι.&lt;br&gt;&lt;br&gt;Ευχαριστώ&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item></channel></rss>