C# 如何正确处理此异常?

C# 如何正确处理此异常?,c#,.net,exception,user-interface,dll,C#,.net,Exception,User Interface,Dll,我还是一个新手程序员(来自C++),我正在创建一个GIU,它显示一个正在运行的软件的标签。其目的是显示标签属性说明和发动机单位。我已经得到了两个DLL,分别是数据访问和NDde。 我读过关于例外处理的书,我见过的最好的想法是: 我做到了。但是程序没有进入该功能,我径直进入我的SelectButton\u点击fct的catch块 TagBrowser.cs using System; using System.Windows.Forms; using IOM.InTouchDataAccess;

我还是一个新手程序员(来自C++),我正在创建一个GIU,它显示一个正在运行的软件的标签。其目的是显示标签属性
说明
发动机单位
。我已经得到了两个DLL,分别是数据访问和NDde。 我读过关于例外处理的书,我见过的最好的想法是:

我做到了。但是程序没有进入该功能,我径直进入我的
SelectButton\u点击
fct的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;
        }
    }
}

我建议您调整异常的
全局处理

您需要处理Windows窗体的
System.Windows.Forms.Application.ThreadException事件

链接:


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

您正在为您的方法声明一个变量
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#中使用返回码,这就是异常的用途。

没错,它不会直接进入异常块。1.什么是例外?2.你能试着用F11来代替跨步吗?是的,我跨步了,它也跨步了。它径直走到了挡块。异常表示客户端请求«视图|标记名失败$如果您正在调试,则在抛出异常和捕获异常时可以中断。(VS2008)在“调试”菜单的“异常”中,勾选“公共语言运行时异常”的抛出框。上帝,谢谢你!您如何能够如此快速地阅读和理解外来代码,并如此出色地处理对象?我注意到这里很多优秀的程序员也这么做。很高兴我能帮上忙。有了一些经验,就更容易深入研究外来代码,因为您知道大多数原则、框架和模式。看看你在一两个月内发布的代码,你会发现你学到了多少:)