1

私はまだ(C ++の)初心者プログラマーであり、実行中のソフトウェアからのタグを表示するGIUを作成しています。目的は、タグのプロパティDescriptionとを表示することですEng Units。私は2つのdllInTouchDataAccessとNDdeを与えられました。私は例外処理について読みましたが、私が見た中で最も良いアイデアはこれでした: 検証関数を作成する

私がやった。しかし、プログラムは関数に入りません。私は自分のSelectButton_Clickfctのcatchブロックにまっすぐ入ります。

TagBrowser.cs

using System;
using System.Windows.Forms;
using IOM.InTouchDataAccess;

namespace InTouchTagBrowser
{
    public partial class InTouchTagBrowser : Form
    {
        public string tagName;
        public string description;
        public string engUnits;

        public InTouchTagBrowser()
        {
            InitializeComponent();
        }

        private void TagBrowser_Load(object sender, EventArgs e)
        {
        }

        private void SelectButton_Click(object sender, EventArgs e)
        {
            try
            {
                tagName = tagNameBox.Text;
                InTouchDdeWrapper inTouchWrapper = new InTouchDdeWrapper();
                inTouchWrapper.Initialize();

                TagDotField tagDotField = new TagDotField(tagName);

                string value = inTouchWrapper.Read(tagName);

                if (EngValidate(inTouchWrapper.Read(tagDotField.EngUnits)) != 0)
                {
                    engUnits = inTouchWrapper.Read(tagDotField.EngUnits);
                }

                else
                {
                    engUnits = "N/A";
                }

                if (inTouchWrapper.Read(tagDotField.Description) != "")
                {
                    description = inTouchWrapper.Read(tagDotField.Description);
                }
                else
                {
                    description = "N/A";
                }

                descriptionlbl.Text = description;
                englbl.Text = engUnits;
                valuelbl.Text = value;
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                MessageBox.Show(ex.Source);
                MessageBox.Show(ex.HelpLink);
                MessageBox.Show(ex.StackTrace);
            }
        }

        private void WriteButton_Click(object sender, EventArgs e)
        {
            try
            {
                if (tagName == "")
                {
                    MessageBox.Show("Please enter a tag!");
                }
                else
                {
                    string inputValue = ValueBox.Text;
                    InTouchDdeWrapper inTouchWrapperWriter = new InTouchDdeWrapper();
                    inTouchWrapperWriter.Initialize();

                    TagDotField tagWriter = new TagDotField(inputValue);
                    inTouchWrapperWriter.Write(tagName, inputValue);
                    valuelbl.Text = inputValue;
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                MessageBox.Show("Tag change successfull");
            }
        }

        public int EngValidate(string engString)
        {
            string exception;
            int x;

            try
            {
                InTouchDdeWrapper inTouchWrapper = new InTouchDdeWrapper();
                inTouchWrapper.Initialize();
                TagDotField tagDotField = new TagDotField(tagName);
                engString = inTouchWrapper.Read(tagDotField.EngUnits);

                x = 1;
            }
            catch (Exception msg)
            {
                exception = msg.ToString();
                if (exception == "")
                    x = 1;
                else
                    x = 0;
            }

            return x;
        }
    }
}
4

2 に答える 2

2

engString実際には使用しないメソッドの変数を宣言しています。さらに、この変数を設定する方法は、例外を引き起こす可能性のあるラッパーから読み取ります (その後、外側の catch ブロックによってキャッチされます)。より良いアプローチは、そのようなメソッドを 1 回だけ読み取ることを宣言することです。

public bool TryRead(InTouchDdeWrapper wrapper, string prop, out string value) 
{
  try 
  {
    value = wrapper.Read(prop);
    return true;
  }
  catch (Exception e)
  {
    value = null;
    return false;
  }  
}

このように呼び出されます:

InTouchDdeWrapper wrapper = new InTouchDdeWrapper();
wrapper.Initialize();

TagDotField field = new TagDotField(tagName);

string engUnits;

if (!TryRead(wrapper, field.EngUnits, out engUnits)) 
{
  engUnits = "N/A";
}

このパターンを理解していただければ幸いです。コード内で多くのクラスを何度もインスタンス化 (および初期化) する場合、1 つのラッパー、1 つのフィールドなどを使用し、値を 1 回だけ読み取る方がよい場合があります。さらに、C# ではリターン コードを使用しないでください。これが例外の目的です。

于 2012-10-05T15:24:52.860 に答える
0

調整することをお勧めしますglobal treatment for exception

System.Windows.Forms.Application.ThreadException eventfor Windows Formsを処理する必要があります。

リンク: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

注: フォーム内のすべての実現済みの try-catch を削除し、1 つの処理のみを設定します

于 2012-10-05T14:55:56.273 に答える