Какой тип исключения выкинуть в этом случае? - PullRequest
7 голосов
/ 13 августа 2010

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

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

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

Спасибо!

Ответы [ 4 ]

8 голосов
/ 13 августа 2010
  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
}
3 голосов
/ 13 августа 2010

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

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

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

1 голос
/ 13 августа 2010

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

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

0 голосов
/ 13 августа 2010

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

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

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

...