如何在C#中捕获导致异常的控件名?

如何在C#中捕获导致异常的控件名?,c#,controls,try-catch,C#,Controls,Try Catch,我有一些文本框应该允许某种格式,但当用户在文本框中以错误的格式输入时,我希望捕获控件名称并清除文本框的文本。清除用户输入,因为它不是给定格式,这对用户非常不友好。如果十个字符中只有一个错了呢?他们得重新打一遍。只需使用一个带有遮罩的,即可获得所需的图案 使用MaskedTextBox时,您可以订阅MaskInputRejected事件,如下所述: 清除用户输入,因为它不是一个给定的格式是非常不友好的用户。如果十个字符中只有一个错了呢?他们得重新打一遍。只需使用一个带有遮罩的,即可获得所需的图案

我有一些文本框应该允许某种格式,但当用户在文本框中以错误的格式输入时,我希望捕获控件名称并清除文本框的文本。

清除用户输入,因为它不是给定格式,这对用户非常不友好。如果十个字符中只有一个错了呢?他们得重新打一遍。只需使用一个带有
遮罩的
,即可获得所需的图案

使用
MaskedTextBox
时,您可以订阅
MaskInputRejected
事件,如下所述:


清除用户输入,因为它不是一个给定的格式是非常不友好的用户。如果十个字符中只有一个错了呢?他们得重新打一遍。只需使用一个带有
遮罩的
,即可获得所需的图案

使用
MaskedTextBox
时,您可以订阅
MaskInputRejected
事件,如下所述:


为预期行为抛出异常永远都是不对的,因为它们非常昂贵。如果您需要查看异常的起源,只需检查堆栈跟踪的顶行。

为预期行为抛出异常永远都是不对的,因为它们非常昂贵。如果您需要查看异常产生的位置,只需检查堆栈跟踪的顶行。

仅调试

您可以在调试模式下从yourForm.cs获取控件名。我认为这段代码不会在relese cuz上运行。源文件不会在其他版本中,对吗

using System.Diagnostics;

public void ParseControlText()
{
    try
    {
        var doubleval = Double.Parse(tb_double.Text);
        var intval    = Int32.Parse(tb_int.Text);

        //... bunch of controls need to be parssed to calculate  something

    }
    catch (FormatException ex)
    {
        var stlast = new StackTrace(ex,true).GetFrames().Last();

       //this requires   form.cs to exist . how am i gonna do this in release? idk
        var stLine = File.ReadLines(stlast.GetFileName())
            .ToList()[stlast.GetFileLineNumber()-1];
        var m = Regex.Match(stLine ,@"\((.*?)\..*?\)"); 
        var ctrlname = m.Groups[1].Value;

        MessageBox.Show( ctrlname + " control's text coundnt be Parsed! " );

    }

}

仅调试

您可以在调试模式下从yourForm.cs获取控件名。我认为这段代码不会在relese cuz上运行。源文件不会在其他版本中,对吗

using System.Diagnostics;

public void ParseControlText()
{
    try
    {
        var doubleval = Double.Parse(tb_double.Text);
        var intval    = Int32.Parse(tb_int.Text);

        //... bunch of controls need to be parssed to calculate  something

    }
    catch (FormatException ex)
    {
        var stlast = new StackTrace(ex,true).GetFrames().Last();

       //this requires   form.cs to exist . how am i gonna do this in release? idk
        var stLine = File.ReadLines(stlast.GetFileName())
            .ToList()[stlast.GetFileLineNumber()-1];
        var m = Regex.Match(stLine ,@"\((.*?)\..*?\)"); 
        var ctrlname = m.Groups[1].Value;

        MessageBox.Show( ctrlname + " control's text coundnt be Parsed! " );

    }

}

您能否告诉我们您是如何检查格式的,以及是什么导致了异常?windows窗体?我认为您不需要捕获任何内容,您不会希望抛出任何异常。您描述的是输入验证。我有几个文本框,我有一个带有三个单选按钮(十进制、二进制和十六进制)的面板。我只需要在每个文本框中输入一个字节,如果用户输入的字节超过一个,比如说二进制“111100001”,我会得到格式化异常。因此,为了使一切变得简单,我只想在出现此类情况时清除控件的文本。您能告诉我们如何检查格式,以及生成异常的原因吗?windows窗体?我认为您不需要捕获任何内容,您不会希望抛出任何异常。您描述的是输入验证。我有几个文本框,我有一个带有三个单选按钮(十进制、二进制和十六进制)的面板。我只需要在每个文本框中输入一个字节,如果用户输入的字节超过一个,比如说二进制“111100001”,我会得到格式化异常。所以,为了使一切变得简单,我只想在出现这种情况时清除控件的文本。我真的很喜欢这样,但我在一个文本框中有三种格式(十进制、二进制和十六进制)。这些是我要寻找的最大可用值:二进制=>11111111十六进制=>ff十进制=>255它在Maskd文本框中可行吗,尤其是设置十进制最大值对我来说似乎更难。在
KeyPress
事件中解析输入并尝试解析输入。如果不正确,您可以将
e.Handled
设置为true,这样就不会在文本框中输入。谢谢CodeMaster!非常有用。我现在就试试这个。我真的很喜欢,但我在一个文本框中有三种格式(十进制、二进制和十六进制)。这些是我要寻找的最大可用值:二进制=>11111111十六进制=>ff十进制=>255在Maskd文本框中是否可行,尤其是设置十进制最大值对我来说似乎更难。在
KeyPress
事件中解析输入并尝试解析输入。如果不正确,您可以将
e.Handled
设置为true,这样就不会在文本框中输入。谢谢CodeMaster!非常有用。我现在就试试这个。我如何检查堆栈?我是C#的新手。如何检查堆栈?我是C#的新手。