Как перехватить все исключения в пользовательском элементе управления - PullRequest
4 голосов
/ 30 октября 2010

У меня есть пользовательский элемент управления, который содержит несколько методов, и у каждого из этих методов есть блок try-catch.Я ловлю только один тип исключений, например ArgumentException.Обновление - я не ловлю одно исключение, но несколько исключений, которые я определил.

Каждый из этих методов обрабатывает ArgumentException одинаково, поэтому у меня есть избыточный код.

Можно ли перехватить ArgumentException в одном месте, чтобы все методы пользовательского элемента управления могли его использовать?

Update1: приложение используется в рабочей среде и используется многими людьми, которыене очень знаком с компьютерами.Упрощенно - им приходится вставлять много чисел в базу данных (с помощью ручного оптического сканера) и, конечно, они допускают ошибки.Существует по крайней мере 8 распространенных исключений (неправильный размер, неправильный тип, ...), и в своей бизнес-логике я ловлю все эти исключения и выкидываю их в GUI.Поскольку среда, в которой установлено приложение, очень паршивая, я воспроизводю громкий звук ошибки и отображаю сообщение об ошибке.

Из-за бизнес-логики у них есть несколько опций для вставки этих чисел, поэтому одна и та же логика перехвата ошибок существует в нескольких методах по всему пользовательскому элементу управления.перехват ArgumentException, но мои собственные исключения, например CodeFormatException, CodeDoesntExistException, CodeNotInTheSelectedRollException и т. д.

Ответы [ 3 ]

2 голосов
/ 30 октября 2010

Вы можете поместить этот кусок кода в некоторую функцию проверки аргументов и вызвать ее в начале вашей функции.

1 голос
/ 31 октября 2010

Если у вас есть права на неуправляемый код, вы можете переопределить метод WndProc вашего UserControl (если у вас нет прав на неуправляемый код, приложение сгенерирует исключение, как только на ваш класс UserControl будет впервые сделана ссылка),События клавиатуры, мыши и рисования вызваны сообщениями, которые обрабатываются в WndProc, поэтому вызовите базовую реализацию этого метода в try ... catch для обработки этих событий.Что касается остальных, вам нужно будет обернуть их каждый в попытку ... поймать, но вы можете переместить свою логику catch в вспомогательный метод, который вызывается из всех блоков catch, чтобы вы не дублировали код.

Редактировать: На самом деле, я думаю, что-то вроде этого может быть лучше.Для него не требуются разрешения, и вы можете использовать его для событий, запускаемых из других элементов управления вашего UserControl, а также:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.Load += new TryCatchHandler(new EventHandler(this.Form1_Load)).EventHandler;
        this.MouseClick += new TryCatchHandler(new MouseEventHandler(this.Form1_MouseClick)).EventHandler;

        this.button1.Click += new TryCatchHandler(new EventHandler(this.button1_Click)).EventHandler;
    }

    private void Form1_MouseClick(object sender, MouseEventArgs e)
    {
        // ...
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // ...
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // ...
    }

    private class TryCatchHandler
    {
        public Delegate handler;

        public TryCatchHandler(Delegate handler)
        {
            this.handler = handler;
        }

        public void EventHandler(object sender, EventArgs e)
        {
            try
            {
                this.handler.Method.Invoke(this.handler.Target, new object[] { sender, e });
            }
            catch (ArgumentException exc)
            {
                // ...
            }
        }
    }
}
0 голосов
/ 01 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...