возникли проблемы с использованием пользовательских исключений в C # - PullRequest
0 голосов
/ 11 марта 2012

У меня есть программа для форм, которую я написал в Visual Studio 2010. В программе я написал новый файл исключений с именем LibraryGeneralExceptions.cs

namespace Database
{
    public class LibraryGeneralExceptions : Exception
    {
        public LibraryGeneralExceptions()
        {
        }

        public void ItemInsertError()
        {
            MessageBox.Show("Item Insert Error", "Error");
        }

        ...
    }
}

в том же пространстве имен, что и у меня

public void ItemInsert(string name,string creator,string publishing,string itemType,string genere, string year)
{
    ...
    if (errorMsg.Length != 0)
    {
       throw new ItemInsertError();
        MessageBox.Show(errorMsg, "error");
    }

в другом пространстве имен, которое использует базу данных и вызывает функции из базы данных. Я пытаюсь настроить try-catch для перехвата исключений, которые база данных создаст с помощью LibraryGeneralExceptions, но я не могу заставить ее работать по некоторым причинам.

Ответы [ 5 ]

2 голосов
/ 11 марта 2012

lakovl, похоже, вы не понимаете, как работают исключения в C #.Для начала вы можете обратиться к статье MSDN об исключениях и обработке исключений , также просмотрите дочерние разделы.

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

Чтобы бытьаналогично представьте, что у вас есть цепочка людей, прибыл грузовик с мороженым, и один человек просит кого-то пойти и купить им мороженое, они убежали к грузовику только для того, чтобы обнаружить, что первоначальный человек не дал им достаточноДеньги.Продавец мороженого выбрасывает исключение InsufficientFundsException, которое поймано и повторно выброшено коллегой.Теперь, если коллеги достаточно щедры, они могут захотеть добавить находки для них, хотя, если у них также нет средств, они перезапустят исключение, свернув его.Наконец, они бегут обратно к инициатору (это называется пузырением), который они могут затем разрешить или прекратить.

Теперь давайте рассмотрим, что вы сделали с вашим исключением.То, что вы пытались сделать, - это создать тип исключения LibraryGeneralExceptions, который подходит (за исключением формы множественного числа, отбросьте s), хотя вы создали метод ItemInsertError, который в вашем коде обрабатывает его так, как если бы онэто исключение само по себе.Итак, давайте попробуем исправить вашу проблему.

Во-первых, похоже, что вы намеревались использовать LibraryGeneralExceptions в качестве подпространства имен, а ItemInsertError - исключение, поэтому здесь правильная реализация:

namespace Database {
    public class ItemInsertError : Exception {
        public ItemInsertError() : base() {}
        public void ItemInsertError(string message) : base(message) {}
    }
}

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

public void ItemInsert(string name,
                       string creator,
                       string publishing,
                       string itemType,
                       string genre,
                       string year) {
    // ...
    if (errorMsg.Length != 0) {
       throw new ItemInsertError(errorMsg);
    }
}

Итак, теперь, когда мы вызываем метод ItemInsert, мы будем обрабатывать исключения в этом куске кода.

try {
    ItemInsert("name", "creator", "publishing", "itemType", "genre", 2012);
} catch (ItemInsertError ex) {
    MessageBox.Show(
        ex.Message, "Error during insert",
        MessageBoxButtons.OK, MessageBoxIcon.Error);
}

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

2 голосов
/ 11 марта 2012

Если вы хотите бросить ItemInsertError, вам нужен класс ItemInsertError, производный от System.Exception:

public class ItemInsertError : Exception
{
}
2 голосов
/ 11 марта 2012

Это неправильно на многих уровнях, я не знаю, с чего начать.Я бы порекомендовал прочесть документацию MSDN по обработке исключений и пользовательских исключений.

http://msdn.microsoft.com/en-us/library/5b2yeyab.aspx

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

См. http://www.blackwasp.co.uk/VSExceptionSnippet.aspx для получения дополнительной информации.

1 голос
/ 11 марта 2012

Вы хотите добавить новый LibraryGeneralExceptions, а не метод внутри вашего исключения.Вы не выбрасываете методы в классе исключений - вы фактически бросаете экземпляр самого класса исключения.Это позволяет вам инкапсулировать некоторую другую информацию для вызывающего абонента, которая может быть полезна (например, состояние системы, когда она выдается, какие данные были переданы, что вызвало исключение и т., вы должны вызвать логику вашего конструктора для LibraryGeneralExceptions.

namespace Database
{
    public class LibraryGeneralExceptions : Exception
    {
        public LibraryGeneralExceptions()
        {
          ItemInsertError();
        }
    }
}

Однако, если вы действительно хотите другое поведение (одно для ItemInsertError и, возможно, другое для NetworkTimeoutError), вы 'Вероятно, я хочу создать для них разные Exception классы.

0 голосов
/ 11 марта 2012

Исключением является экземпляр класса System.Exception или производный класс. Вы должны получить свой класс исключений из System.Exception:

namespace LibraryExceptions {
    public class InsertError : Exception  {

    }
}

и throw его новый экземпляр.

throw new LibraryExceptions.InsertError()
...