C# 是否有方法引用导致异常的对象?

C# 是否有方法引用导致异常的对象?,c#,exception,reference,C#,Exception,Reference,试图通过使用异常处理找到一种惰性方法来处理部分数据验证。例如,如果文本框中的文本应该是一个字符串,那么当它包含所有数字时,代码尝试将其解析为一个字符串,它将抛出一个异常。从catch块,是否有一种方法引用问题对象并说。。。将其背景色更改为黄色?您可以访问textbox对象,而且在您的示例中,textbox并不是导致异常的对象 WPF示例: int number; try { number = int.Parse(textBox1.Text); } catch (FormatExcepti

试图通过使用异常处理找到一种惰性方法来处理部分数据验证。例如,如果文本框中的文本应该是一个字符串,那么当它包含所有数字时,代码尝试将其解析为一个字符串,它将抛出一个异常。从catch块,是否有一种方法引用问题对象并说。。。将其背景色更改为黄色?

您可以访问textbox对象,而且在您的示例中,textbox并不是导致异常的对象

WPF示例:

int number;
try
{
    number = int.Parse(textBox1.Text);
}
catch (FormatException)
{
    textBox1.Background = new SolidColorBrush(Colors.Red);
}
尽管对于这个特定示例,最好使用
TryParse

如果您的对象只能在Validate方法中访问,并且Validate方法失败,并且您希望使此对象在
catch
中可用,则在这种情况下,您需要实现自定义异常,该异常将具有TextBox类型的字段

[编辑]

我想我误解了这个问题

自定义异常

public class MyException : Exception
{
    public TextBox TextBox { get; private set; }

    public MyException(TextBox textBox)
    {
        TextBox = textBox;
    }
}
解析、验证或任何方法:

public int Parse()
{
    try
    {
        return int.Parse(textBox1.Text);
    }
    catch (FormatException)
    {
        throw new MyException(textBox1);
    }
}
用法:

    int number;
    try
    {
        number = int.Parse(textBox1.Text);
    }
    catch (MyException exception)
    {
        exception.TextBox.Background = new SolidColorBrush(Colors.Red);
    }

您可以访问textbox对象,实际上,在您的示例中,textbox并不是导致异常的对象

WPF示例:

int number;
try
{
    number = int.Parse(textBox1.Text);
}
catch (FormatException)
{
    textBox1.Background = new SolidColorBrush(Colors.Red);
}
尽管对于这个特定示例,最好使用
TryParse

如果您的对象只能在Validate方法中访问,并且Validate方法失败,并且您希望使此对象在
catch
中可用,则在这种情况下,您需要实现自定义异常,该异常将具有TextBox类型的字段

[编辑]

我想我误解了这个问题

自定义异常

public class MyException : Exception
{
    public TextBox TextBox { get; private set; }

    public MyException(TextBox textBox)
    {
        TextBox = textBox;
    }
}
解析、验证或任何方法:

public int Parse()
{
    try
    {
        return int.Parse(textBox1.Text);
    }
    catch (FormatException)
    {
        throw new MyException(textBox1);
    }
}
用法:

    int number;
    try
    {
        number = int.Parse(textBox1.Text);
    }
    catch (MyException exception)
    {
        exception.TextBox.Background = new SolidColorBrush(Colors.Red);
    }

否。导致异常的对象可能是某个对象的私有成员,如果允许通过异常处理程序将其公开,则会破坏类的封装。

否。导致异常的对象可能是某个对象的私有成员,通过允许它通过异常处理程序公开,您将破坏类的封装。

您需要记住,导致异常的不是对象。这是一行引发异常的代码

您可以创建保存对象的对象,然后发回所选对象。(或这个物体)

从MSDN:

通过内置功能,您可以获得最接近的功能:

没有

您需要记住,导致异常的不是对象。这是一行引发异常的代码

您可以创建保存对象的对象,然后发回所选对象。(或这个物体)

从MSDN:

通过内置功能,您可以获得最接近的功能:


如前所述,您可以创建自己的自定义异常,该异常可以与正在验证的控件通信,从而使您能够对控件进行一些布局更改

但我认为引发一个事件比引发一个异常更干净,因为在异常中,事件可以将对象与验证错误进行通信。然后可以在事件订阅服务器中执行对象布局更改

不过,最干净的方法是使用现有的ASP.NET验证控件。regex验证器可以执行数字/非数字的实际测试,但缺少连接布局更改的位置。为此,您可以使用
CustomValidator
绑定
ServerValidate
事件,并在该事件中检测到错误时设置控件布局。

但是,如果您选择执行基于事件的验证,尝试如下所示

/// <summary>
/// Event args for the validation error. 
/// </summary>
/// <typeparam name="ControlType">The control type accepted. (Can be 'Control´ for flexibility.</typeparam>
public class EvalidationErrorEventArgs<ControlType> : System.EventArgs
    where ControlType : Control
{
    ControlType ControlCausingException { get; private set; }

    public FormatException RaisedException { get; private set; }

    public EvalidationErrorEventArgs(ControlType controlCausingException, FormatException ex)
    {
        this.ControlCausingException = controlCausingException;
    }
}

/// <summary>
/// The validation error event.
/// </summary>
/// <typeparam name="ControlType">The type of control to be communicated by the event.</typeparam>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void ValidationErrorEvent<ControlType>(object sender, EvalidationErrorEventArgs<ControlType> e);

/// <summary>
/// Base validator, expects validation 
/// errors to be communicated as a FormatException. 
/// Other exception types are thrown.
/// </summary>
public abstract class TextBoxValidator
{
    public event ValidationErrorEvent<TextBox> ValidationError;

    /// <summary>
    /// Do validation. Raises event if format exception 
    /// occurs and listeners are registered. 
    /// </summary>
    /// <param name="textBoxToValidate">Control to validate.</param>
    public void Validate(TextBox textBoxToValidate)
    {
        try
        {
            DoValidation(textBoxToValidate);
        }
        catch (FormatException e)
        {
            if (ValidationError != null)
            {
                ValidationError(this, new EvalidationErrorEventArgs<TextBox>(textBoxToValidate, e));
            }
            else
            {
                throw;
            }
        }
    }

    /// <summary>
    /// Overwrite to implement the actual 
    /// validation.
    /// </summary>
    /// <param name="txt">Control to validate</param>
    protected abstract void DoValidation(TextBox txt);
}

/// <summary>
/// Performs validation of input controls content. 
/// </summary>
public abstract class IsTextValidator : TextBoxValidator
{
    /// <summary>
    /// Validates a text box to contain an integer value. 
    /// </summary>
    /// <param name="txt">Control to validate</param>
    protected override void DoValidation(TextBox txt)
    {
        int.Parse(txt.Text);
    }
}
//
///验证错误的事件参数。
/// 
///控件类型已被接受。(可以是“控制”,以实现灵活性。
公共类EvalidationErrorEventArgs:System.EventArgs
其中ControlType:Control
{
ControlType ControlCausingException{get;private set;}
public FormatException RaisedException{get;private set;}
public EvalidationErrorEventArgs(ControlType controlCausingException,FormatException ex)
{
this.ControlCausingException=ControlCausingException;
}
}
/// 
///验证错误事件。
/// 
///事件要传达的控件类型。
/// 
/// 
公共委托void validationErrorRevent(对象发送方,EvalidationErrorEventArgs e);
/// 
///基本验证器,需要验证
///要作为FormatException传递的错误。
///将引发其他异常类型。
/// 
公共抽象类TextBoxValidator
{
公共事件验证错误事件验证错误;
/// 
///执行验证。如果格式异常,则引发事件
///发生并注册侦听器。
/// 
///控件进行验证。
公共无效验证(TextBox textBoxToValidate)
{
尝试
{
DoValidation(textBoxToValidate);
}
捕获(格式化异常)
{
if(ValidationError!=null)
{
ValidationError(这是新的EvalidationErrorEventArgs(textBoxToValidate,e));
}
其他的
{
投掷;
}
}
}
/// 
///覆盖以实现实际的
///验证。
/// 
///控件进行验证
受保护的摘要验证(文本框txt);
}
/// 
///执行输入控件内容的验证。
/// 
公共抽象类IsTextValidator:TextBoxValidator
{
/// 
///验证文本框是否包含整数值。
/// 
///控件进行验证
受保护的覆盖无效验证(文本框txt)
{
int.Parse(txt.Text);
}
}

如前所述,您可以创建自己的自定义异常,该异常可以与正在验证的控件通信,从而使您能够对控件进行一些布局更改

但我认为举办一个活动比举办一个exc更干净