Какое исключение для броска в этом случае?

Я пишу c# приложение, которое использует автоматизацию для управления другой программой. Естественно та программа должна работать за моей программой для работы. Когда моя программа ищет приложение и не может найти его, я хотел бы выдать исключение (на данный момент позже, конечно, я мог попытаться открыть приложение или сказать пользователю открывать его, или...).

Если я реализую пользовательское исключение - или использую существующий NotSupportedException (или одно из других исключений.NET). Если бы пользовательское исключение, что Вы предложили бы? Я думал о реализации пользовательского исключения, я буду называть ее MyAppNameException и затем просто использовать сообщение для объявления, какова проблема была?

Есть ли любые общие правила к выдаванию исключения способом, которое делает Вашу программу более читаемой и удобной для пользователя, или является мной просто уделяющий это слишком много внимания :)?

Спасибо!

7
задан Evan 12 August 2010 в 20:39
поделиться

4 ответа

  1. Сначала определите MyAppCustomException как абстрактный базовый класс.

  2. Затем наследовать от него с помощью AppNotFoundCustomException .

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

Вот пример кода, который иллюстрирует эту концепцию:

public abstract class MyAppCustomException : System.Exception
{
    internal MyAppCustomException(string message)
        : base(message)
    {
    }

    internal MyAppCustomException(string message, System.Exception innerException)
        : base(message,innerException)
    {            
    }
}

public class AppNotFoundCustomException : MyAppCustomException
{
    public AppNotFoundCustomException(): base("Could not find app")
    {
    }
}

А вот пример клиента try / catch :

try 
{
   // Do Stuff
}
catch(AppNotFoundCustomException)
{
   // We know how to handle this
}
catch(MyAppCustomException) // base class
{
   // we don't know how to handle this, but we know it's a problem with our app
}
8
ответ дан 6 December 2019 в 21:08
поделиться

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

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

В противном случае может подойти что-то из иерархии System.Runtime.InteropServices.ExternalException .

3
ответ дан 6 December 2019 в 21:08
поделиться

Ага, вы перестарались. Ничего хорошего не произойдет, когда вы выбросите исключение, любое исключение, эта программа волшебным образом не начнет работать, когда вы это сделаете. Могут произойти только плохие вещи, например, какой-то код действительно перехватывает это исключение и пытается продолжить. Или никто не поймает это и не получит диалоговое окно с отчетом об ошибках Windows. Можно также создать окно сообщения и завершить его с помощью Environment.Exit ().

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

1
ответ дан 6 December 2019 в 21:08
поделиться

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

Более близкое совпадение - это что-то InvalidOperationException, где член может использоваться, но не с учетом текущего состояния.

Вы говорите «приложение», что означает скорее исполняемый файл, чем компонент для использования чем-то другим. В этом случае вы не собираетесь переносить исключение в вызывающий код (так как вызывающего кода нет), а либо поднимите диалоговое окно (для приложения с графическим интерфейсом пользователя), либо напишите в Console.Error (для консольного приложения). Это делает вероятным, что либо вы просто собираетесь отобразить значение свойства сообщения исключения, либо вам просто нужен тип класса, чтобы пометить конкретное сообщение. Либо простое извлечение AppNotRunningException из Exception, либо прямое использование Exception, вероятно, будет работать отлично, в зависимости от того, какой из двух вариантов вам наиболее удобен.

0
ответ дан 6 December 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: