在这种情况下抛出什么类型的异常?

时间:2010-08-12 20:39:17

标签: c# custom-exceptions

我正在编写一个c#应用程序,它使用自动化来控制另一个程序。当然,该程序必须运行才能使我的程序正常运行。当我的程序查找应用程序但找不到它时,我想抛出异常(现在我可以尝试打开应用程序,或者告诉用户打开它,或者......)。

我应该实现自定义异常 - 还是使用现有的NotSupportedException(或其他.NET异常之一)。如果是自定义异常,你会建议什么?我正在考虑实现一个自定义异常我称之为MyAppNameException然后只是使用该消息来声明问题是什么?

是否有任何一般规则以一种使程序更具可读性和用户友好性的方式抛出异常,或者我只是在考虑这个问题:)

谢谢!

4 个答案:

答案 0 :(得分:8)

  1. 首先,将MyAppCustomException定义为抽象基类。

  2. 然后使用AppNotFoundCustomException继承它。

  3. 通过这种方式,您可以从应用中捕获所有例外,或只是特定的例外。

    以下是一些说明这个概念的示例代码:

    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
    }
    

答案 1 :(得分:3)

我使用的Framework Guidelines book表示只有在以与现有异常不同的方式以编程方式处理错误条件时,才应创建自定义异常。

在您的情况下,如果您想创建自定义异常以启动后端安装程序,这是唯一的,我认为自定义异常是可以的。

否则,来自System.Runtime.InteropServices.ExternalException层次结构的东西可能是合适的。

答案 2 :(得分:1)

是的,你过度了。当你抛出一个异常时,没有什么好事发生,任何异常,当你这样做时,程序并没有神奇地开始运行。只有不好的事情可能会发生,就像一些代码实际捕获异常并试图继续。或者没有人抓住它并获得Windows错误报告对话框。也可以建立一个消息框并用Environment.Exit()调用它。

当然,如果您发现该程序没有运行,它对用户可能会更有用。

答案 3 :(得分:0)

你当然不应该像你的建议那样使用NotSupportedException,因为你的应用程序确实支持这个方法。实现接口或抽象类时使用NotSupportedException,但某些成员未完全实现,因为它们在上下文中没有意义(从输出流中读取,清除只读集合等)。

更接近的匹配是InvalidOperationException,其中可以使用成员,但不能使用当前状态。

你说“应用程序”,它表示可执行文件而不是其他东西使用的组件。在这种情况下,您不会将异常冒泡到调用代码(因为没有调用代码),而是引发对话框(对于GUI应用程序)或写入Console.Error(对于控制台应用程序)。这使得您可能只是要显示异常的Message属性的值,或者您只需要类类型来标记特定的消息。简单地从Exception派生AppNotRunningException或直接使用Exception可能会很好地完成,具体取决于您最方便的两个中的哪一个。