Есть ли способ ссылки на объект, вызвавший исключение? - PullRequest
2 голосов
/ 25 мая 2011

Пытаюсь найти ленивый способ обработки части моей проверки данных с помощью обработки исключений.Например, если текст в текстовом поле должен был быть строкой, код пытается разобрать его в строку, когда все его числа, он выдаст исключение.Из блока catch можно ли ссылаться на проблемный объект и сказать ... изменить его цвет фона на желтый?

Ответы [ 4 ]

0 голосов
/ 25 мая 2011

Как уже предлагалось, вы могли бы создать свое собственное исключение, которое могло бы сообщать проверяемый элемент управления, который затем мог бы позволить вам внести некоторые изменения макета в элемент управления

Но я думаю, что было бы чище вызывать событиечем вызвать исключение, когда событие может сообщить объекту с ошибкой проверки.Затем можно выполнить изменение макета объекта в подписчике события.

Самым чистым было бы использование существующих элементов управления проверкой 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);
    }
}
0 голосов
/ 25 мая 2011

Нет.Вполне возможно, что объект, вызвавший исключение, является частным членом какого-либо объекта, и, позволяя ему экспонироваться через обработчик исключений, вы нарушите инкапсуляцию класса.

0 голосов
/ 25 мая 2011

Нет.

Необходимо помнить, что это не объект, вызывающий исключение.Это строка кода, которая выдает исключение.

Вы можете создать пользовательских исключений , которые содержат объекты, и отправляют обратно выбранный объект.(или этот объект)

От MSDN: Разработка пользовательских исключений

Ближайшее, что вы можете получить со встроенной функциональностью:

Исключение. Свойство источника

0 голосов
/ 25 мая 2011

Вы можете получить доступ к вашему объекту текстового поля, и фактически в вашем примере текстовое поле не является тем, которое вызвало исключение.

Пример 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...