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