catch(InterruptedException e)的详细用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了catch(InterruptedException e)的详细用法相关的知识,希望对你有一定的参考价值。

里面可以写什么

虽然 java 执行时期系统所提供的预设处理器对除错很有用,你通常想要自己处理例外。这样做有两个优点:第一,它让你修正错误。第二,它可以避免程式自动终止。每当错误发生时,如果你的程式就停止而且列印出堆叠追踪,大多数的使用者都会感到很困惑。很幸运,你很容易就能避免这种情形。 <br><br>要防备并且处理执行时期错误,只要将你要监视的程式码放在 try 区块里即可。在 try 区块之后紧接著在 catch 子句里指定你希望捕捉的例外型态<br><br>错误捕捉例子: <br>try <br> <br>code; //将自己的代码放在其中; <br> <br>catch(e) //如果上面的代码有错误,这里就捕获 <br> <br>alert(e.number); //获得错误信息 <br> 参考技术A 可以写对异常的处理,就是在异常出现时要进行的动作。本回答被提问者采纳

VB.NET 使用多个 Catch 块尝试 Catch

【中文标题】VB.NET 使用多个 Catch 块尝试 Catch【英文标题】:VB.NET Try Catch with multiple Catch blocks 【发布时间】:2013-01-01 03:53:39 【问题描述】:

这是一个非常奇怪的问题。我们有一个带有多个 Catch 块的 Try Catch。第一个 Catch 块没有代码,只是一个注释。

Try
  'Some Code
Catch ex As ThreadAbortException
  'Do Nothing
Catch ex As Exception
  HandleException(ex)
End Try

如果抛出除 ThreadAbortException 之外的异常,则如预期的那样,它会被第二个 Catch 捕获。但是,在 VS2010 中单步执行代码时,ex 对象在这种情况下是 Nothing。到目前为止,我们已经找到了两种方法来“修复”这个问题。

修复 1: 重命名第一个异常变量。

Try
  'Some Code
Catch tex As ThreadAbortException
  'Do Nothing
Catch ex As Exception
  HandleException(ex)
End Try

修复 2:将任意代码行添加到第一个 Catch 块。

Try
  'Some Code
Catch ex As ThreadAbortException
  Dim i As Integer = 1
Catch ex As Exception
  HandleException(ex)
End Try

如果在上述任何情况下运行,HandleException 中的代码似乎仍然可以正常运行。这是 Visual Studio 或调试器中的错误吗?还是我们在这里遗漏了什么,上面的第一段代码无效?

这一切都在 .NET 4.0 中完成。

【问题讨论】:

你是在发布模式下单步执行代码吗? +1。好问题,*** 上的稀有宝石。 这个调试器错误在 VS2012 中看起来已修复。请确保您已安装 SP1,它修复了许多调试器错误。 我们确实安装了 SP1。我们也有 VS2012,但仍在使用 VS2010 进行大多数开发。如果这在 VS2012 中有效,那将确实确认这是一个 VS2010 错误。 哇!你通过一个简单的问题获得了 90 声望 :) 【参考方案1】:

好的,让我详细说明...

看来你必须在每次捕获中都有一个“结果”。如果您只是希望某个特定捕获不发生任何事情,请不要包含它,或者将其移动到代码中的其他位置。

Try
   'Some Code
Catch ex As ThreadAbortException
   'Do something(ex: HandleExceptionSub())
Catch ex As Exception
   HandleException(ex)
End Try

如果你“捕捉”了一个异常,你必须对它做点什么。

编辑:

我还发现了这些信息,可以帮助您进一步了解 try catch 的工作方式:

多个 Catch 块

一个try块可以抛出多个异常,可以使用多个catch块来处理。请记住,更专业的 catch 块应该位于通用的 catch 块之前。否则编译器会显示编译错误。 Multiple Catch Blocks

这不是调试器的“错误”。调试器旨在帮助您查找和处理所有异常。

编辑: 似乎可以从我在另一篇文章中阅读的内容中完全避免此异常。似乎最好避免异常而不是不处理它。 Handling ThreadAbortException

编辑: 刚刚在 try 中找到了有关多个 catch 块的更多信息。这来自 MSDN,并指出永远不会到达空白 catch 块之后的 catch 块...Try Catch Finally Statement 进一步证明这不是错误,而是强制处理代码中所有异常的预期功能。

编辑: 为了让 cmets 中的一些人直截了当,我创建了一个非常简单的测试程序来查看这是否确实是一个错误。我的发现是 catch 块工作得很好。似乎按照 MSDN 记录的方式创建具有多个 Catch 块的 Try Catch 就像他们所说的那样工作。

    private void button1_Click(object sender, EventArgs e)
    
        try
        
            if (textBox1.Text == "")
            
                throw new ArgumentNullException("textBox1", "TextBox can not be empty");
            
            else
            
                MyString(textBox1.Text);
            
        
        catch (ArgumentNullException ex)
        
            //nothing
        
        catch (Exception ex)
        
            MessageBox.Show("Test: " + ex.Message);
        
    

    private int MyString(string text)
    
        return int.Parse(text);
    

我创建了一个带有按钮和文本框的简单表单。如果文本框为空,我会抛出 ArgumentNullException,并在“MyString”中将字符串解析为抛出“FormatException”的整数。有一个空白的 catch 块,这不是处理“捕获”异常的正确方法确实有效。所以据我所知,这不是一个错误。显然,我唯一能同意 Teejay 和 Konrad 的一点是,您不能使用 try catch 方法捕获和处理 ThreadAbortException。 Konrad 的解决方案是编写 try catch 的最佳方式。

【讨论】:

可能,他只是想默默地“压制”所有的 ThreadAbortEx。 这篇文章中几乎所有的信息都是错误的(最后一段除外)。这调试器中的一个错误,您确实不必在处理程序块中有代码。最后,您建议在此处使用GoTo 的评论简直是残酷的。 GoTo 的有效用途很少(如果有的话)。这不是一个。 @jforward5 Teejay 已经发布了证明。此外,查看VB language specification(第10.10.1.2 节)会告诉您Catch 块允许为空。事实上,无需查看:如果不同,编译器会将其标记为错误。 @jforward5 再次阅读 Teejay 的回答:这是调试器中的一个错误,因为调试器将 ex 对象显示为具有值 Nothing,而实际上它明显具有不同的值。调试器显示错误的值。那是一个错误。不一定要有关于此的知识库文章才能成为错误:Microsoft 并非无所不知,他们不知道所有错误,而且可能以前没有人注意到这个问题。 @jforward5 你完全错了,Teejay 的代码、MSDN 语言标准都告诉你。如果您确信自己是对的,那么唯一正确的做法是为您的假设设计一个检验:编写一个满足我们所有 cmets 标准的代码,其中包含一个空的 Catch 块,后跟一个 less - 特定非空Catch 块并查看第二块是否被执行。这称为falsification,到目前为止你拒绝使用它。【参考方案2】:

这似乎是 VS 的调试器错误。

证明

如果你写:

Try
    Throw New InvalidOperationException("MESSAGE")
Catch ex As ArgumentException
    'Do Nothing
Catch ex As Exception
    Debug.WriteLine(ex)
End Try

然后您查看ex,它在快速观察模式

中计算为Nothing

但是

在控制台中程序正确打印System.InvalidOperationException: MESSAGE

【讨论】:

【参考方案3】:

Teejay 有正确的答案。

但是,如果您的 Catch 块为空,则处理此异常完全没有意义。您只想阻止最后一个块捕获它。你可以使用你的方法——但是考虑到有一个空的Catch块通常是不可接受的:异常要么不被捕获,要么应该被正确处理;默默地吞下它们必须被视为一个错误。您的案例是此规则的一个例外,但因此需要在代码中记录,否则会混淆细心的维护人员。

嗯,VB 有一个专门针对这种情况的习惯用法:

Try
    ' …
Catch ex As Exception When Not TypeOf ex Is ThreadAbortException
    ' Only executed if `ex` isn’t a ThreadAbortException
End Try

这段代码根本没有捕捉到ThreadAbortException,如果你不想处理它,这是正确的做法:ThreadAbortException 不能被吞下所以即使你捕捉到了它,它将在Catch 块的末尾重新抛出。

请注意,这与 SysDragon 的回答根本不同,后者使用传统的 If 语句,而此处的代码使用 Catch 语句中的特殊子句作为过滤器。

【讨论】:

有很多VB是“特别”的。 这是一个我以前不知道的美妙语法。无论如何,重要的是要注意这与 Dan 的代码的行为不同,实际上它不会捕获从 Try...Catch 抛出的 ThreadAbortException,必须在外部处理以避免程序崩溃。 @Teejay 不,它的行为相同:ThreadAbortException 不能被抓到。如果你抓住它,它只会被重新抛出。我可能应该在我的回答中明确说明这一点。 这很棒。这确实是我们想要完成的(因为我们无法吞下 ThreadAbortException)。这是做我们想做的事情的一种更清洁的方式。 @KonradRudolph Mhhh,不太清楚。在 Dan 的代码中,ThreadAbortEx捕获并吞下。正如您在编辑中所写,When Not ... ThreadAbortEx 根本没有被捕获。很高兴这就是丹正在寻找的东西,但恕我直言,这两个街区的行为不同。我错过了什么吗?帮助我理解。

以上是关于catch(InterruptedException e)的详细用法的主要内容,如果未能解决你的问题,请参考以下文章

JAVA多线程中,如何让一个线程去等待N个线程执行完成后,再执行。

try-catch语句

为啥 try..catch..finally 块的 finally 节在 catch 之前运行?

在java语言中try-catch的catch中能否再加try--catch?

try/catch 和 MFC TRY/CATCH 有啥区别?

catch (Exception e) catch (Throwable e) catch (IOException e) 再抛出异常,catch里的分别是啥意思