1

我仍然是一个新手程序员(来自 C++),我正在创建一个 GIU,它显示来自正在运行的软件的标签。目的是显示标签属性DescriptionEng Units. 我得到了 2 个 dll InTouchDataAccess 和 NDde。我读过异常处理,我见过的最好的想法是这个: 创建一个验证函数

我做了。但是程序没有进入函数,我直接进入我的SelectButton_Clickfct 的 catch 块。

标签浏览器.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 块捕获)。更好的方法是声明这样的方法只读一次:

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";
}

我希望你能理解这种模式。您在代码中一遍又一遍地实例化(和初始化)很多类,最好只有一个包装器、一个字段等......并且只读取一次值。此外,您不应该在 C# 中使用返回码,这就是异常的用途。

于 2012-10-05T15:24:52.860 回答
0

建议你调整global treatment for exception

您需要处理System.Windows.Forms.Application.ThreadException eventWindows 窗体。

链接:http: //msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

注意:您删除了表单中所有已实现的 try-catch,并且只设置了一种处理

于 2012-10-05T14:55:56.273 回答