7

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

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

是否有任何一般规则以使您的程序更具可读性和用户友好性的方式抛出异常,或者我只是想太多了:)?

谢谢!

4

4 回答 4

8
  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
}
于 2010-08-12T20:42:03.937 回答
3

我使用的《框架指南》一书指出,只有当错误条件可以以与任何现有异常不同的方式以编程方式处理时,您才应该创建自定义异常。

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

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

于 2010-08-12T20:54:28.570 回答
1

是的,你做得太过分了。当您抛出异常时,不会发生任何好事,任何异常,当您这样做时,该程序不会神奇地开始运行。可能只会发生不好的事情,例如某些代码实际上捕获了该异常并尝试继续。或者没有人发现它并获得 Windows 错误报告对话框。不妨设置一个消息框,然后使用 Environment.Exit() 结束一天。

当然,如果您发现该程序没有运行,则实际启动该程序可能对用户更有用。

于 2010-08-12T20:56:25.473 回答
0

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

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

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

于 2010-08-12T21:10:47.017 回答