Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Bug with exception handling?

Îåêßíçóå áðü ôï ìÝëïò Eyclides. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 19-10-2004, 16:51. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-10-2004, 09:44 317

    Bug with exception handling?

    Αν τρέξετε το παρακάτω απλό προγραμματάκι σε μια windows forms με ένα κουμπί θα δείτε ότι το exception που ΄γίνεται raised στην chng_RowChanged δεν πιάνεται πουθενά. AN τώρα στη θέση  της

    chng.RowChanged+=new DataRowChangeEventHandler(chng_RowChanged); γράψετε

    chng.RowChanging+=new DataRowChangeEventHandler(chng_RowChanged);

    τότε το exception γίνεται caught. Any idea?

    private void button1_Click(object sender, System.EventArgs e)

    {

    DataTable data=new DataTable();

    DataSet fDS=new DataSet();

    data.TableName="DATA";

    data.Columns.Add ("ID",typeof(int));

    data.Columns.Add ("Code",typeof(string));

    fDS.Tables.Add(data);

    DataRow row=data.NewRow();

    row["ID"]=1;

    row["CODE"]="0000";

    data.Rows.Add(row);

    try

    {

    DataTable chng=data.GetChanges(DataRowState.Added|DataRowState.Modified|DataRowState.Deleted);

    chng.RowChanged+=new DataRowChangeEventHandler(chng_RowChanged);

    chng.Rows[0][0]=2;

    }

    catch(Exception ex)

    {

    Debug.WriteLine("#2.Exception : "+ex.Message);

    throw;

    }

     

    }

    private void chng_RowChanged(object sender, DataRowChangeEventArgs e)

    {

    try

    {

    throw new Exception ("ERROR");

    }

    catch(Exception ex)

    {

    Debug.WriteLine ("#1.Exception : "+ex.Message);

    throw;

    }

    }

  •  19-10-2004, 15:58 328 σε απάντηση της 317

    Re: Bug with exception handling?

    Να υπάρχει πρόβλημα με το exception handling είναι "ελαφρώς" απίθανο.Wink

    Αυτό που πρέπει να συμβαίνει είναι ότι ο κώδικας μέσα στο DataTable που σηκώνει το RowChanged event πρέπει να καταπίνει τα exceptions, ενώ του RowChanging να τα σηκώνει προς τα πάνω. Ένα σχετικό άρθρο στο MSDN λέει τα παρακάτω:

    Τhe ColumnChanging, RowChanging, and RowDeleting events are raised during the update process. You can use these events to validate data or perform other types of processing. Because the updates are in process during these events, you can cancel the update by throwing an exception, which prevents the change from being completed. For more information, see Data Validation in Datasets.

    The ColumnChanged, RowChanged, and RowDeleted events are notification events that are raised when the update has been completed successfully. These events are useful when you want to take further action based on a successful update.

    Σίγουρα, δεν λέει ξεκάθαρα ότι το RowChanged σταματάει τα exceptions. Αν το κάνει όμως, έχει τη λογική του. RowChanged καταπίνει το exception γιατί δεν είναι δυνατόν να κάνεις τίποτα πλέον στο σημείο που άλλαξες το row. Η αλλαγή έχει ήδη γίνει με επιτυχία και το datatable μπορεί να συνεχίσει, απλά απέτυχε ο κώδικας που χρησιμοποίησες για να κάνει κάτι μετά την αλλαγή. Λογικά, εκεί θα πρέπει να προσπαθήσεις να αντιμετωπίσεις το σφάλμα. Αν το δείς από την πλευρά του datatable, τί να κάνει αν δει ένα error στο RowChanged? Δεν μπορεί να αντιστρέψει τις αλλαγές που έκανε, και δεν υπάρχει λόγος να σταματήσει την εκτέλεσή του.

    Σίγουρα πάντως, το MSDN θα έπρεπε να αναφέρει τη διαφορά.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  19-10-2004, 16:51 330 σε απάντηση της 317

    Re: Bug with exception handling?

    Βρήκα και το παρακάτω post http://www.dotnet247.com/247reference/msgs/42/210579.aspx, όπου κάποιος από τη Microsoft λέει:

    I share your concern. We've few cases where we are eating exceptions which
    will just mask the errors. Exceptions should be propagated all the way.
    We'll be fixing issues related with eating exceptions.

    Όπως φαίνεται, η ιδέα του να τρως τα exceptions θεωρείται μάλλον κακή.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems