2011-05-25 67 views
2

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

+0

所以,你想在callstack某处的'try'内调用'foo.Validate',并且能够返回'foo'? – Gabe 2011-05-25 04:30:51

+0

你不应该抛出异常来验证你的字符串解析。使用asp.net验证控件来确定输入是使用RegEx的文本还是数字。这可以在没有回传的情况下完成。如果你需要回发,那么当验证控件的IsValid为false时,将texbox(或其他)的背景颜色设置为黄色。 – MikeTeeVee 2011-05-25 04:41:05

+0

以及接线错误提供者的思维。在Java中,您可以使用GetSource来查找导致异常的代码的对象。如果我可以引用它,我可以在其分配的控件上触发errorprovider,并将其文本设置为异常消息。 – Sinaesthetic 2011-05-25 04:41:53

回答

0

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

WPF例如:

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

虽然这个特殊的例子,最好是使用TryParse代替。

如果您的对象仅在您的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); 
    } 
+0

我想这将是最接近我在java中提到的东西,只是它似乎不是可以重复使用的可以这么说。我假设我可以重写这个只是引入一个对象,然后取消它和GetType ...我会修补它。我认为,作为C#是相当多的Java,它会有一个类似的方法。谢谢 – Sinaesthetic 2011-11-07 18:04:38

0

号这可能是造成异常的对象是私人一些对象的成员,并通过允许它通过异常处理程序暴露出来,你会破坏e类的封装。

0

编号

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

您可以创建保存对象的custom exceptions,并发回选择的对象。 (或对象)

从MSDN:Designing custom exceptions

最近你可以用内置的功能得到:

Exception.Source Property

+0

我相信在java中你可以使用GetSource来检索导致异常的代码的父对象。 Theres在C#中没有这样的? – Sinaesthetic 2011-05-25 04:40:30

0

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

但是,我认为提出事件比提出异常更清洁,然后事件可以将对象与验证错误进行通信。然后,您可以在事件订户中执行对象布局更改。

虽然最干净的事情就是使用现有的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); 
    } 
}