- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
通常,在实现模板方法或接口(interface)方法时,只能抛出该方法定义的一种特定类型的异常。但是您的实现可能会为抛出不兼容异常类型或许多不同异常类型的 API 创建类。
自然地,您需要捕获它们并将异常包装到适合已实现方法签名的类型中。假设我们要实现这个接口(interface):
public interface SomeDataGetter {
public long getSomeData() throws IOException;
}
我们的实现使用了一些其他的 API 产品来实现这个,我们调用的 API 方法可能有这个签名:
public long loadFromDBOrCache(Object ... params) throws SQLException, IOException, ObjectNotFoundException, RuntimeException, FridayException, NotWeekendException, NumberIs42Exception;
我编造这个是为了演示您无法按具体类型准确枚举所有可能抛出的异常的情况。请注意,IOException 是我们允许从我们的实现中抛出的类型。
现在我可以在实现这个时走懒惰的路线并包装任何东西以适合我的签名:
@Override
public long getSomeData() throws IOException {
try {
return loadFromDB(...);
} catch (Exception e) {
throw new IOException(e.getMessage(), e);
}
}
这显然会将任何异常包装到一个 IOException(甚至是一个 IOException)中,并且它运行正常。但我想不包装 IOExceptions,因为我可以在不包装的情况下抛出它们:
@Override
public long getSomeData() throws IOException {
try {
return loadFromDB(...);
} catch (IOException e) {
throw e;
} catch (Exception e) {
throw new IOException(e.getMessage(), e);
}
}
您可以想象,如果实现中存在多个可能的异常并且允许您从实现中获得多个异常,那么这很快就会变得很麻烦。对于我想要传递的每个异常,我都需要一个额外的捕获。
保持可读性的最佳习惯用法是什么(另外,我很懒,不想写所有这些额外的捕获)并且仍然避免不必要的异常嵌套?或者我不应该打扰而把所有东西都包起来吗?
最佳答案
一种方法是创建一个方法,将所有“禁止的”异常包装在一个允许的异常中,同时返回所有允许的异常,就像这样:
private static void throwIoException(Exception e)
throws IOException // <<= Add other "allowed" exceptions here
{
if (e instanceof IOException) {
throw (IOException)e;
}
... // <<= Add checks for other "allowed" exceptions here
throw new IOException(e.getMessage(), e);
}
现在您可以使用单个 catch
block ,并根据需要进行包装:
try {
return loadFromDB(...);
} catch (Exception e) {
throwIoException(e);
}
一个令人不快的结果是堆栈跟踪在新创建的 IOException
的顶部显示实用程序方法,但这并不重要,因为真正的异常是包装异常,而不是 IOException
包装器。如果您捕获的异常恰好是 IOException
,the correct stack trace should remain in place .
关于java - 让特定异常绕过广泛的 catch block 的成语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19057340/
我想知道是否可以安全地编写 catch() 来捕获所有 System.Exception 类型。或者我是否必须坚持使用 catch(Exception) 来完成此任务。我知道对于其他异常类型(例如 I
在 C# 中,'Catch'、'Catch (Exception)' 和 'Catch(Exception e)' 之间有什么区别? MSDN article on try-catch在其示例中使用了
然后一个 Promise 调用另一个 Promise,并且内部 Promise 从 catch .then block 中的外部 Promise 返回 我一般都在这里和谷歌上搜索过。尝试使用简单的 t
我们可以在 Try-Catch 中使用多个 catch 块。 但我的问题是:为什么可以使用单个 catch 块完成时使用多个 catch 块? 假设我想要我的问题的确切原因,我可以通过 Ex.mess
所以我在 service.ts 中有这个用户服务功能其中包括数据库的东西。 export const service = { async getAll(): Promise { try {
我不确定这里发生了什么。很明显为什么内扣会捕获throw 2 ,但为什么外面catch(int x)捕获 throw ?我以为catch(int x)应该只捕获整数值。第二个throw有可能吗?抛出什
我目前正在以不同的方式加载图像,如下所示: try { // way 1 } catch { // way 1 didn't work try { // way 2 }
这两者有什么区别?一个比另一个快吗?两者似乎都有效。有人请解释 没有 promise 的人: client.query(query1) .then(data => { callback(null
它几乎可以在所有语言中找到,而且我大部分时间都在使用它。 我不知道它是内部的,不知道它是如何真正起作用的。 它如何在任何语言的运行时在 native 级别工作? 例如:如果在 try 内部发生 sta
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 1年前关闭。
我正在编写一个用于学习目的的短代码,要求用户输入密码才能登录 Facebook。我正在测试异常处理,由于某种原因,当密码错误时,Catch 部分没有执行。代码是: import java.util.S
如果try-catch的catch block 中抛出异常,那么finally block 会被调用吗? try { //some thing which throws error } cat
try { while ((inputLine = bufferedReader.readLine()) != null) { String[] words = inputLine.s
在 C# 上下文中,可以使用如下代码: try { ... } catch { ... } 在其他情况下,代码可以是: try { ... } catch (Exc
有时我在探索 ServiceStack 的代码库时遇到以下构造: try { ... } catch (Exception) { throw; } 在我看来,这种结构没有任何作用。这样做的
我最近遇到了一个 Javascript 问题,捕获错误,因此在抛出异常时崩溃。 funcReturnPromise().then().catch() 我必须将其更改为: try { funcRet
我在编写一些测试的 C++ 文件中遇到此错误: error: no member named 'Session' in namespace 'Catch' testResult = C
CException 是VC++抛出的所有异常的基类型,所以它应该捕获所有的异常吧? 最佳答案 CException 不是所有扩展的基类型(它可能是 MFC 代码使用的所有异常的基类型,但仅此而已)。
每次我看到 catch all 语句时: try { // some code } catch (...) { } 它一直是一种滥用。 反对使用 cache all 子句的论点是显而易见的。它会捕
代码相当简单——问题是 groupPath 字符串中有一个无效字符(准确地说是“/”)。 我正在尝试做的(至少作为权宜之计)是跳过我无法获得 cn 的 DirectoryEntries --- 不管为
我是一名优秀的程序员,十分优秀!