C# 如何正确处理此异常?
我还是一个新手程序员(来自C++),我正在创建一个GIU,它显示一个正在运行的软件的标签。其目的是显示标签属性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;
说明
和发动机单位
。我已经得到了两个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)在“调试”菜单的“异常”中,勾选“公共语言运行时异常”的抛出框。上帝,谢谢你!您如何能够如此快速地阅读和理解外来代码,并如此出色地处理对象?我注意到这里很多优秀的程序员也这么做。很高兴我能帮上忙。有了一些经验,就更容易深入研究外来代码,因为您知道大多数原则、框架和模式。看看你在一两个月内发布的代码,你会发现你学到了多少:)