C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[7]: DataTable.RowChanged 例外が潰される


(過去ログ 14 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■4800 / inTopicNo.1)  DataTable.RowChanged 例外が潰される
  
□投稿者/ おだ (1回)-(2007/06/26(Tue) 09:47:30)

分類:[.NET 全般] 

はじめまして、おだ といいます。

質問についてですが、

DataTable.RowChangedイベントで発生した例外が握り潰される
という現象が発生しています。
(DataRowの追加時、任意の列の値変更時とも同様です)

何か情報をお持ちの方が居られましたら、教えて頂けないでしょうか。

※急ぎで困っているという訳ではありません。

以下環境と再現コードです。

「環境」
WindowsXP SP2
Visual Studio 2005
.NET Framework:2.0.50727

「再現コード」
using System;
using System.Collections.Generic;
using System.Text;

using System.Data;

namespace RowChangedTest
{
  class Program
  {
    static void Main(string[] args)
    {
      DataTable table = new DataTable("TABLE_1");
      DataColumn column1 = table.Columns.Add("COL_1", typeof(string));
      DataColumn column2 = table.Columns.Add("COL_2", typeof(decimal));

      table.RowChanging += new DataRowChangeEventHandler(table_RowChanging);
      table.RowChanged += new DataRowChangeEventHandler(table_RowChanged);

      table.Rows.Add("ABC", 1m);

      Console.ReadKey();
    }

    static void table_RowChanging(object sender, DataRowChangeEventArgs e)
    {
      Console.WriteLine("RowChanging");
      // ここでは、落ちる
      //throw new Exception("The method or operation is not implemented.");
    }

    static void table_RowChanged(object sender, DataRowChangeEventArgs e)
    {
      Console.WriteLine("RowChanged");
      // ここは、落ちない
      throw new Exception("The method or operation is not implemented.");
    }
  }
}

引用返信 編集キー/
■4802 / inTopicNo.2)  Re[1]: DataTable.RowChanged 例外が潰される
□投稿者/ とりこびと (27回)-(2007/06/26(Tue) 10:21:27)
とりこびと さんの Web サイト
こんにちは。とりこびとです。

■No4800 (おだ さん) に返信

再現コードをコピペして試してみましたが、再現できませんでした・・・。

引用返信 編集キー/
■4804 / inTopicNo.3)  Re[2]: DataTable.RowChanged 例外が潰される
□投稿者/ とりこびと (28回)-(2007/06/26(Tue) 10:33:41)
とりこびと さんの Web サイト
こんにちは。とりこびとです。

> 再現コードをコピペして試してみましたが、再現できませんでした・・・。

すみません、再現しました。m(_ _;)m
デバッグするとつかまるのですね・・・。orz

というわけで、さっきのはナシで。

引用返信 編集キー/
■4812 / inTopicNo.4)  Re[3]: DataTable.RowChanged 例外が潰される
□投稿者/ おだ (2回)-(2007/06/26(Tue) 12:28:28)
2007/06/26(Tue) 21:49:47 編集(投稿者)
2007/06/26(Tue) 21:49:42 編集(投稿者)
2007/06/26(Tue) 21:48:37 編集(投稿者)

VisualStudioでデバッグしている時は、
呼び出された関数で例外を投げても、
VisualStudioが勝手に捕まえて
呼び出し元関数に例外が伝播しなかったような・・・。

参考にしたURL
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10474&forum=7&start=6

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24387&forum=7
引用返信 編集キー/
■4909 / inTopicNo.5)  Re[4]: DataTable.RowChanged 例外が潰される
□投稿者/ おだ (3回)-(2007/06/28(Thu) 15:35:37)
やっぱり例外を握りつぶしている様です。

そういう仕様なんでしょうか?
ちょっと文献が見つけられませんが…。

引き続き、ご存知の方居られませんか?
引用返信 編集キー/
■4914 / inTopicNo.6)  Re[5]: DataTable.RowChanged 例外が潰される
□投稿者/ 中博俊 (1108回)-(2007/06/28(Thu) 17:12:49)
中博俊 さんの Web サイト
ライセンス違反を助長しかねない書き込みがあったので削除しました。

引用返信 編集キー/
■4969 / inTopicNo.7)  Re[6]: DataTable.RowChanged 例外が潰される
□投稿者/ シャノン (188回)-(2007/06/29(Fri) 15:21:26)
No4914 (中博俊 さん) に返信
> ライセンス違反を助長しかねない書き込みがあったので削除しました。

というわけなので、ライセンスに違反しない推測の部分だけ書くことにします。
消されてしまったものに加筆しています。
これは推測であり、文献等の情報に基づいたものではありません。

RowChanged は、行が変更されたことを通知するイベントです。
その中で何が起きようと、既に変更は完了しており、元に戻すことはできません。
例外は伝播させるだけ無駄と判断されたのかもしれません。

別解。
例外とは、その責務が果たせなかったときに発生するものと考えてみましょう。
RowChanged イベントが発生した時点で、通知するというイベントの責務は果たされています。
その中で例外が発生したことが意味するのは、あくまで「行の変更通知を受けて実行される何らかの処理が責務を果たせなかった」ことであり、その「何らかの処理」を駆動するところまでは RowChanged の責務の範囲ではないと考えれば、RowChanged が失敗したことにはなりません。
よって、RowChanged は例外を伝播させないのかもしれません。

どちらにせよ、「…かもしれません」です。
理由が何であれ、握り潰されていることに変わりはないでしょう。
引用返信 編集キー/
■4983 / inTopicNo.8)  Re[7]: DataTable.RowChanged 例外が潰される
□投稿者/ おだ (4回)-(2007/06/30(Sat) 00:11:32)
シャノンさん返信有難うございます。

【別解。】の考え方だと、
〜ed系のイベントは全て例外を握り潰していると
統一感があって良いのですが。

「他にも例外を握り潰しているイベントがあるのかな?」
と疑問が湧きますね。

少しずつ調べていこうかなと思います。

今回はこれで解決済みとさせて頂きます。

有難うございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -