繁体   English   中英

有没有办法引用导致异常的 object?

[英]Is there a way to reference the object that caused an exception?

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

您可以访问您的文本框 object,实际上在您的示例文本框中也不是导致异常的文本框。

WPF 示例:

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

尽管对于这个特定示例,最好改用TryParse

如果您的 object 只能在您的 Validate 方法中访问并且 validate 方法失败,并且您想让这个 object 在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);
    }

不,导致异常的 object 可能是某些 object 的私有成员,并且通过允许它通过异常处理程序公开,您将破坏 ZA2F2ED4F8EBC2CBB4C21A29DZ.40AB61 的封装

不。

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

您可以创建包含对象的自定义异常,并返回选择的 object。 (或这个对象)

来自 MSDN:设计自定义异常

最接近您可以使用内置功能获得:

Exception.Source 属性

正如已经建议的那样,您可以创建自己的自定义异常,该异常可以传达正在验证的控件,然后可以使您对控件进行一些布局更改

但我认为引发事件比引发异常更干净,然后事件可以将 object 与验证错误进行通信。 然后,您可以在事件订阅者中执行 object 布局更改。

最干净的方法是使用现有的 ASP.NET 验证控件。 正则表达式验证器可以执行数字/非数字的实际测试,但缺少连接布局更改的地方。 为此,您可以使用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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM