Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抛出异常以停止进程_C#_Exception Handling - Fatal编程技术网

C# 抛出异常以停止进程

C# 抛出异常以停止进程,c#,exception-handling,C#,Exception Handling,有时在C#中,我想抛出一个无法处理的异常。导致进程停止的升级异常。这可能吗?如果您不想处理异常,请不要处理它。您可以执行以下操作: class BadassException : Exception { public BadassException(string message) { Environment.FailFast(message); } } ... throw new BadassException("Erk!!!"); 像这样简单地结束流程如何: Proc

有时在C#中,我想抛出一个无法处理的异常。导致进程停止的升级异常。这可能吗?

如果您不想处理异常,请不要处理它。

您可以执行以下操作:

class BadassException : Exception
{
  public BadassException(string message)
  {
    Environment.FailFast(message);
  }
}

...

throw new BadassException("Erk!!!");

像这样简单地结束流程如何:

Process.GetCurrentProcess().Close();

那也不例外,那是原子弹


不过说真的,有更好的方法来处理这种情况。如果要终止进程,请查看以下选项。

这实际上是不可能的,因为每个异常都必须继承自
异常
基类,并且可以执行
捕获(异常)

然而,正如其他人所指出的,你可能会很快失败。您还可以抛出无法具体捕获的异常,如下所示:

public class MyLibraryClass
{
    private class MyException : Exception { ... }

    public void MyMethod() { throw new MyException(); }
}

然后调用方不能执行
捕获(MyException exc)
,只能执行
捕获(Exception exc)
。但是,这仍然意味着可以捕获异常。

任何未处理的异常都将停止应用程序。通常应用程序都有一个应用程序或顶级异常处理程序,它可以捕获任何未处理的异常,进行任何数据维护,并优雅地关闭应用程序

在您的例子中,我认为最好的方法是创建一个新的异常,它派生自名为StopApplicationException之类的异常类

然后,每当需要停止应用程序时,抛出这种类型的异常。在调用堆栈更上层的catch块中:

catch (StopApplicationException)
{
  //Stop your application
}
catch (ArgumentNullException)
{
  //Null Exception Logic goes here...
}
catch  ...And so forth

为什么不简单地抛出一个异常并强制关闭进程?+1只是为了彻底滥用抛出语法。很明显这是一个糟糕的例外。我认为这是一个可怕的编码。异常不应该包含任何逻辑。抛出异常,然后由catch块根据异常的类型确定执行何种逻辑。抛出你的坏异常,但让catch块处理环境。FailFast。@Jon Raynor:我同意你的观点,但OP没有要求这样做。我只是给出了要求:)CLR支持抛出非异常的对象。用一个小手滚,你可以很容易地扔任何东西。IIRC,这些将仅使用
catch{}
捕获。