0

xml ファイルをインターフェイスにロードしようとしていますが、xml ファイルのデータに基づいて多くの例外が発生する可能性があるため、すべての例外を一度にキャッチしたいと考えています。私は約15の例外を取得し、それを1回RichTextBoxまたは何か他のものまたはMessageBox.

for (int i = 0; i < this.SortedLaneConfigs.Count; i++)
    {
         if(this.SortedLaneConfigs[i].CheckConsistency())
            {
                throw new DataConsistencyException(String.Format("Lane #{0} NOT consistent : {1}", i, e.Message)
            }
    }


if (this.SortedLaneConfigs[i - 1].EndB > this.SortedConfigs[i].BeginB)
    {
        throw new DataConsistencyException(String.Format("Lanes {0} & {1}  overlap", i - 1, i));
    }

    this.SortedLaneConfigs.ForEach(
        laneConfig =>
        {
            if (this.SortedLaneConfigs.FindAll(item => item.Id == laneConfig.Id).Count != 1)
                {
                    new DataConsistencyException(String.Format("Id \"{0}\" present more than once", laneConfig.Id));
                }
        });

この通常の方法で、例外をキャッチしてメッセージ ボックスに表示できます。

 try
    {
         this.SortedLaneConfigs[i].CheckConsistency();
    }
catch (Exception e)
    {
        MessageBox.Show("Error message below: \n\"" + String.Format("Configs #{0} NOT consistent : {1}", SortedLaneConfigs[i].Id, e.Message) + "\"", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

私はそれをグーグルで検索し、次の 2 つのリンクを見つけました。link1 : http://blogs.elangovanr.com/post/Catch-multiple-Exceptions-together-in-C.aspx

これらの 2 つのリンクから提案されたソリューションを適応させて、すべての例外を一度に RichTextBox またはその他の何かまたは messageBox に表示するにはどうすればよいですか。私を助けてください。

4

2 に答える 2

1

Exception.Message 文字列を連結して、好きな場所に表示できます。メソッドを入力する前に、まず StringBuilder インスタンスを作成します。

StringBuilder exBuilder = new StringBuilder();

次に、メソッドを実行し、例外メッセージを追加します。

try
{
         this.SortedLaneConfigs[i].CheckConsistency();
}
catch (Exception e)
{
        exBuilder.Append("Error message below: \n\"" + String.Format("Configs #{0} NOT consistent : {1}", SortedLaneConfigs[i].Id, e.Message) + "\"");
        exBuilder.Append(Environment.NewLine);
}

終了したら、文字列を取得できますexBuilder.ToString();

richTextBox1.Text = exBuilder.ToString();

編集: と があるフォームがあるRichTextboxButtonします。Buttonがメソッドを開始する場合、ユース ケースは次のようになります。

public partial class Form1 : Form
{
        StringBuilder exBuilder;
        public Form2()
        {
            InitializeComponent();
            exBuilder = new StringBuilder();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            exBuilder.Clear();
            MyMethod();
            //and all your other methods that have exBuilder.Append in their try-catch blocks
            richTextBox1.Text = exBuilder.ToString();
        }

        void MyMethod()
        {
            try
            {
                //you code or whatever
            }
            catch(Exception e)
            {
                exBuilder.Append("Error message below: \n\"" + String.Format("Configs #{0} NOT consistent : {1}", parameter, e.Message) + "\"" + Environment.NewLine);
            }
        }
}
于 2012-11-01T15:06:11.197 に答える
1

私が間違っている場合は訂正してください。ただし、発生する可能性のある 15 の異なる例外を処理し、それらRichTextBoxを一度に表示する必要があると思います。を使用try...catchして、それらのすべてをキャッチし、リストに収集してから、AggregateExceptionを作成できます。それを渡して、RichTextBox含まれているすべてのエラーを表示します。コードサンプルは次のとおりです。

private void Form1_Load(System.Object sender, System.EventArgs e)
{
    Dictionary<int, int> dict = GetDictionaryWithData();
    try {
        DoProcessing(dict);
    } catch (AggregateException ex) {
        RichTextBox1.Text = ex.ToString;
    }
}

private Dictionary<int, int> GetDictionaryWithData()
{
    Dictionary<int, int> dict = new Dictionary<int, int>();
    {
        dict.Add(5, 5);
        dict.Add(4, 0);
        dict.Add(3, 0);
        dict.Add(2, 2);
        dict.Add(1, 0);
    }
    return dict;
}

private void DoProcessing(Dictionary<int, int> dict)
{
    List<Exception> exceptions = new List<Exception>();
    for (int i = 0; i <= dict.Count - 1; i++) {
        int key = dict.Keys(i);
        int value = dict.Values(i);
        try {
            int result = key / value;
        } catch (Exception ex) {
            exceptions.Add(ex);
        }
    }
    if (exceptions.Count > 0)
        throw new AggregateException(exceptions);
}
于 2012-11-01T15:03:49.827 に答える