例如,我很好奇,如果在下面的代码中,我可以放心,无论是执行Foo()还是Bar()将执行.
try {
... // Assume there is not return statement here
Foo();
} catch (Exception e) {
Bar();
}
Run Code Online (Sandbox Code Playgroud)
我对finally块非常熟悉,不需要对该功能进行解释.
我问,因为上面的代码由于存在而无法在Java中工作Throwable,我发现了这种方法.
还有"烧毁房子"停止申请的方式:
Environment.Exit(int code);
Environment.FailFast(string message);
Thread.CurrentThread.Abort();
AppDomain.Unload(AppDomain.CurrentDomain);
Run Code Online (Sandbox Code Playgroud)
为了好玩,这是另一个:)
[DllImport("kernel32.dll",SetLastError = true)]
static extern bool WriteProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
byte [] lpBuffer,
uint nSize,
out UIntPtr lpNumberOfBytesWritten);
var myProcess = Process.GetCurrentProcess();
var hProcess = myProcess.Handle;
var rnd = new Random();
while(true)
{
var writeTo = new IntPtr((int)rnd.Next(0, int.MaxValue));
var toWrite = new byte[1024];
UIntPtr written;
WriteProcessMemory(
hProcess,
writeTo,
toWrite,
(uint)toWrite.Length,
out written);
}
Run Code Online (Sandbox Code Playgroud)
出于好奇和刺激,让我们带他们去试驾!
我们的试验台:
static void Main(string[] args)
{
Trace.Listeners.Add(new ConsoleTraceListener());
AppDomain.CurrentDomain.UnhandledException += OnNoes;
try
{
// INSERT BURN STATEMENT
Foo();
}
catch (Exception e)
{
Bar();
}
finally
{
Baz();
}
}
static void Foo()
{
Trace.WriteLine("I AM FOO!");
}
static void Bar()
{
Trace.WriteLine("I AM BAR!");
}
static void Baz()
{
Trace.WriteLine("I AM BAZ!");
}
static void OnNoes(object sender, UnhandledExceptionEventArgs e)
{
Trace.WriteLine("OhNoes!");
}
Run Code Online (Sandbox Code Playgroud)
结果!
烧伤声明:
Thread.CurrentThread.Abort();
Run Code Online (Sandbox Code Playgroud)
输出:
I AM BAR!
I AM BAZ!
Run Code Online (Sandbox Code Playgroud)
烧伤声明:
AppDomain.Unload(AppDomain.CurrentDomain);
Run Code Online (Sandbox Code Playgroud)
输出:
I AM BAR!
I AM BAZ!
Run Code Online (Sandbox Code Playgroud)
烧伤声明:
Environment.Exit(-1);
Run Code Online (Sandbox Code Playgroud)
输出:
Nothing! No trace output at all!
Run Code Online (Sandbox Code Playgroud)
烧伤声明:
Environment.FailFast("Burn!!!");
Run Code Online (Sandbox Code Playgroud)
输出:
Application crash! A FatalExecutionEngineError was thrown,
which was not caught by any block/handler. No trace output.
Run Code Online (Sandbox Code Playgroud)
你去吧!什么?我错过了一个?
烧伤声明:
Splode();
Run Code Online (Sandbox Code Playgroud)
"Splode"在哪里:
static void Splode()
{
var myProcess = Process.GetCurrentProcess();
var hProcess = myProcess.Handle;
var rnd = new Random();
while (true)
{
var writeTo = new IntPtr((int)rnd.Next(0, int.MaxValue));
var toWrite = new byte[1024];
UIntPtr written;
WriteProcessMemory(
hProcess,
writeTo,
toWrite,
(uint)toWrite.Length,
out written);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Application crash! A FatalExecutionEngineError was thrown,
which was not caught by any block/handler. No trace output.
Crashed Visual Studio while running attached!
Run Code Online (Sandbox Code Playgroud)
是的......最明显的是await,yield break/ yield return,goto,if(false),等,在注释中提到.但是所有这些语句/表达式都必须由您自己编写,包含您的try语句的方法,因此您不必担心它们.
然而,即使这些分开,有是一个方法没有抛出异常或返回(或运行的是这两种方法的)退出.那就是......抛出一些不例外的东西.
C#语言规范规定,您可以抛出的唯一内容是类的实例Exception或null文字(在这种情况下NullReferenceException抛出a ).在§8.9.5中找到:
的[掷]表达式必须表示从System.Exception或具有System.Exception的(或其子类)作为其有效基类的类型参数类型的派生的类类型的类类型的System.Exception的值,.如果表达式的求值产生null,则抛出System.NullReferenceException.
但是,此限制仅限制C#代码.C#代码编译成中间语言,不受此限制.也可以在C#语言规范中找到,§8.10:
某些编程语言可能支持不能表示为从System.Exception派生的对象的异常,尽管C#代码永远不会生成此类异常.
为了捕获这些异常,您需要使用一般的catch子句,如下所示:
try
{
//...
Foo();
}
catch
{
Bar();
}
Run Code Online (Sandbox Code Playgroud)
注意:此方法仅适用于在2.0版之前编译到.NET框架.从该版本开始,CLR将抛出的对象包装在一个RuntimeWrappedException.谢谢,svick!
此外,还有一些人提到杀死这个过程,或者抛出一个StackOverflowException,这两个过程都可以很好地完成这个任务.除了这些之外还有其他方法,但我不这么认为(除了突然拔掉电脑,天堂禁止.)希望这有帮助!--Brandon
假设我们有以下代码:
try
{
/*Breaking statement goes here*/
Foo();
}
catch (Exception ex)
{
Bar();
}
finally
{
Baz();
}
Run Code Online (Sandbox Code Playgroud)
我将断路器分为 3 个常见原因:
代码流程语句:
1.1. return: 富(-); 酒吧(-); 巴兹(+);
1.2. goto: 富(-); 酒吧(-); 巴兹(+);
1.3. if(false): 富(-); 酒吧(-); 巴兹(+);
1.4. while(true){}: 富(-); 酒吧(-); 巴兹(-);
1.5. yield return,如果该方法返回 IEnumerable 并yield return出现在try块之前: Foo(-); 酒吧(-); 巴兹(-);
1.6. yield break,如果该方法返回 IEnumerable:Foo(-); 酒吧(-); 巴兹(-);
1.7. break,如果代码被循环包裹:Foo(-); 酒吧(-); 巴兹(+);
1.8. continue,如果代码被循环包裹:Foo(-); 酒吧(-); 巴兹(+);
进程/域/线程终止。
2.1. Process.GetCurrentProcess().Kill(): 富(-); 酒吧(-); 巴兹(-);
2.2. Environment.Exit(0): 富(-); 酒吧(-); 巴兹(-);
2.3. Environment.FailFast(""): 富(-); 酒吧(-); 巴兹(-);
2.4. AppDomain.Unload(AppDomain.CurrentDomain): 富(-); 酒吧(+);巴兹(+);
2.5. Thread.CurrentThread.Abort(): 富(-); 酒吧(+);巴兹(+);
未处理的异常。
3.1. .NET 2.0 之前的非托管代码中的异常:Foo(-); 酒吧(-); 巴兹(+);
3.2. 自 .NET 2.0 以来非托管代码中的异常:Foo(-); 酒吧(+);巴兹(+);
3.3. 自 .NET 4.0 以来已损坏的进程状态异常(也<legacyCorruptedStateExceptionsPolicy>未HandleProcessCorruptedStateExceptionsAttribute指定):Foo(-); 酒吧(-); 巴兹(+);
3.4. .NET 4.0 之前的损坏的进程状态异常或<legacyCorruptedStateExceptionsPolicy>指定HandleProcessCorruptedStateExceptionsAttribute:Foo(-); 酒吧(+);巴兹(+);
3.5. 自 .NET 2.0 起,另一个线程中出现<legacyUnhandledExceptionPolicy>异常且未启用:Foo(-); 酒吧(-); 巴兹(-);
3.6. .NET 2.0 之前的另一个线程中的异常或<legacyUnhandledExceptionPolicy>已启用:Foo(+); 酒吧(-); 巴兹(+);
| 归档时间: |
|
| 查看次数: |
492 次 |
| 最近记录: |