我想在finally块中关闭我的流,但它会抛出一个IOException所以我似乎必须try在finally块中嵌套另一个块才能关闭流.这是正确的方法吗?看起来有点笨重.
这是代码:
public void read() {
try {
r = new BufferedReader(new InputStreamReader(address.openStream()));
String inLine;
while ((inLine = r.readLine()) != null) {
System.out.println(inLine);
}
} catch (IOException readException) {
readException.printStackTrace();
} finally {
try {
if (r!=null) r.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud) 当return;try块中存在try-finally执行时,我感到困惑.根据我的理解,finally块将始终执行,即在返回调用方法之前.在考虑以下简单代码时:
public class TryCatchTest {
public static void main(String[] args){
System.out.println(test());
}
static int test(){
int x = 1;
try{
return x;
}
finally{
x = x + 1;
}
}
}
Run Code Online (Sandbox Code Playgroud)
打印的结果实际上是1.这是否表示finally块未执行?任何人都可以帮助我吗?
注意:这不是Jeff的问题的重复.
那个问题问"是等同的吗?" 我知道没有,我想知道为什么!
我问的原因是我只是清楚它有多重要,结论对我来说似乎很奇怪.
Microsoft企业库的异常处理块建议我们使用此模式:
catch (Exception x)
{
if (ExceptionPolicy.HandleException(x, ExceptionPolicies.MyPolicy))
throw;
// recover from x somehow
}
Run Code Online (Sandbox Code Playgroud)
该策略是在XML文件中定义的,这意味着如果客户遇到问题,我们可以修改策略以帮助跟踪(或者可能还有问题)以便快速解决问题,直到我们正确处理它为止. - 这可能涉及与第三方争论,关于谁的错.
这基本上是对一个简单事实的承认,即在实际应用中,如果没有这样的设施,实际上就无法管理异常类型的数量及其"可恢复性"状态.
与此同时,MS的CLR团队表示这不是一个选择,事实证明这些人知道他们在谈论什么!问题是在catch块运行之前,finally嵌套在块内的任何块try都将被执行.所以这些finally块可能会执行以下任何操作:
请注意,using语句和C++/CLI析构函数构建在try/上finally,因此它们也会受到影响.
很明显,过滤异常的catch/ throw模式并不好.实际需要的是一种通过策略过滤异常而不实际捕获它们从而触发finally块执行的方法,除非我们找到一个告诉我们异常可以安全恢复的策略.
CLR团队最近在博客上写了这篇文章:
结果是我们必须在VB.NET中编写一个辅助函数,以允许我们从C#访问这个重要的功能.存在问题的一个重要线索就是BCL中有代码可以做到这一点.很多人都写过关于这样做的博客,但他们很少提及关于try/ finallyblocks 的事情,这是杀手.
我想知道的是:
更新:如上所述,我已经搜索过Microsoft Connect而没有找到任何内容.我也(不出所料)谷歌搜索.我只找到人们解释为什么他们需要这个功能,或者指出它在VB.NET中的优势,或者毫无结果地希望它将 …
我想finally在我的C++程序中实现一个块,如果不是原生设施,那么该语言肯定有工具可以实现.我想知道最好的方法是什么?
我发现以下行为至少很奇怪:
def errors():
try:
ErrorErrorError
finally:
return 10
print errors()
# prints: 10
# It should raise: NameError: name 'ErrorErrorError' is not defined
Run Code Online (Sandbox Code Playgroud)
return在finally子句中使用时,异常消失.那是一个错误吗?有记录吗?
但真正的问题(以及我将标记为正确的答案)是:
python开发人员允许这种奇怪行为的理由是什么?
我跑ildasm发现这个:
using(Simple simp = new Simple())
{
Console.WriteLine("here");
}
Run Code Online (Sandbox Code Playgroud)
生成与此等效的IL代码:
Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
if(simp != null)
{
simp.Dispose();
}
}
Run Code Online (Sandbox Code Playgroud)
而问题是为什么它会在最后检查null?只有在执行try块时才会执行finally块,并且只有在Simple构造函数成功时才会执行try块(即不抛出异常),在这种情况下simp将为非null.(如果担心在Simple构造函数和try块的开头之间可能会出现一些干预步骤,那么这确实是一个问题,因为可能会抛出一个异常,阻止finally块执行.)那么,为什么地狱?
暂且不谈(请)使用声明是否比try-finally更好的论点,我将try-finally块写成:
Simple simp = new Simple();
try
{
Console.WriteLine("here");
}
finally
{
simp.Dispose();
simp = null; // sanity-check in case I touch simp again
// because I don't rely on all classes
// necessarily throwing
// ObjectDisposedException
}
Run Code Online (Sandbox Code Playgroud) 我正在构建一个最新的Angular 6架构并且来自AngularJS,这是我无法平衡的事情:HTTP请求的基本处理.
所以,为了这个问题,让我们说我想要一个可观察的.因为它似乎是Angular的未来.
在AngularJS中,我从非常优雅的东西出发:
service.getAll()
.then(onSuccess) // I process the data
.catch(onError) // I do whatever needed to notify anyone about the issue
.finally(onFinally); // I stop the loading spinner and other stuff
Run Code Online (Sandbox Code Playgroud)
现在在Angular 6/RxJS 6中,我不明白为什么一切都那么复杂,看起来不对.
我可以找到两种方法来做同上面的事情:
满管
this.service.getAll()
.pipe(
map((data) => this.onSuccess(data)),
catchError(error => of(this.handleError(error))),
finalize(() => this.stopLoading())
)
.subscribe();
Run Code Online (Sandbox Code Playgroud)由于我们必须使用管道进行最终化,我不妨使用管道来处理所有事情,我认为最好的做法是让一切都按照相同的顺序排列.但现在我们不得不抛出一些东西,称之为"不太容易理解",我不喜欢这样.
半管所以我尝试了另一个想法,只有我需要的管道(敲定),我保留订阅回调.
this.service.getAll()
.pipe(
finalize(() => this.stopLoading())
)
.subscribe(
(data) => this.onSuccess(data),
(error) => this.handleError(error)
);
Run Code Online (Sandbox Code Playgroud)但是,好吧.是不是有点落后?我们仍然没有实际名称的回调,我们在阅读处理和错误之前完成.奇怪的.
所以我肯定不明白.我在网上找不到任何与此基本问题相关的内容.你要么有人想要"成功又最后",或者"成功和错误",但没有人想要其中的3个.也许我太老了,我不明白最新的最佳实践(如果是这样,请教育我!).
我的需求很简单:
1.我想处理从服务中获取的数据
2.我想得到错误以便显示给用户
3.我想停止在调用之前刚启动的加载微调器,或者一旦第一个完成成功或错误(我真的想要最终),再打一次电话
如何使用observable处理基本的HTTP调用?
(我不想要任何.toPromise,请,我想了解如何处理新的东西)
我是一个Java新手,我想知道,如果我有以下典型的Java代码
public class MyApp {
public static void main(String[] args) {
try {
// do stuff
} catch {
// handle errors
} finally {
// clean up connections etc.
}
}
}
Run Code Online (Sandbox Code Playgroud)
JVM是否保证finally块始终运行?为了理解我来自哪里,我习惯了C/C++程序,如果你取消引用一个NULL指针就可能崩溃,之后就不能运行任何代码了.
但是,由于我理解Java和整个GC /托管内存业务,所以没有空指针解除引用的东西,一切都是可捕获的预期,所以我的程序没有真正的崩溃方式可以让它跳过最后,或者在那里?例如,在Python中,我通常会这样做
try:
# do stuff
except AnExceptionIKnewMightHappen:
# react in an appropriate way
except:
# log that weird error I had not known could happen
Run Code Online (Sandbox Code Playgroud)
我没有通过我的代码就没有任何应用程序死亡.
当然,如果操作系统由于某种原因导致进程终止(或者如果某些东西杀死了整个系统,比如拉动插件),那么Java就无法做到.此外,从PHP我知道你无法防范的非可捕获错误,即使解释器在它发生之后仍然存在(至少它能够输出正确的消息).
编辑:为了清楚起见(这并没有被任何人误解),让我补充一点,我在寻找代码中的内容,这可能会导致最终被绕过.所以指向System.exit是一个有用的提醒,即使我不明白为什么我想要做那样的事情.
退出JVM是一种相当明显的方式,我认为这是一个外部原因.该注释指出你还必须记住在JVM和应用程序继续运行时退出的线程的可能性非常有用,因为即使现在我看起来也很明显,我没有想到它.
Python finally的if/else语句是否与其语句类似try/except/finally?可以让我们简化这个的东西:
if condition1:
do stuff
clean up
elif condition2:
do stuff
clean up
elif condition3:
do stuff
clean up
...
...
Run Code Online (Sandbox Code Playgroud)
对此:
if condition1:
do stuff
elif condition2:
do stuff
elif condition3:
do stuff
...
...
finally:
clean up
Run Code Online (Sandbox Code Playgroud)
finally只有在条件满足并且"做东西"运行后才能调用的地方?相反,如果没有满足条件,则finally不会运行代码.
我讨厌亵渎亵渎神灵,但我能描述的最好的方法就是GOTO在每个"做东西"块的末尾都有一个声明finally.
从本质上讲,它与else声明相反.虽然else仅在没有满足其他条件的情况下运行,但只有在满足其他条件时才会运行.
语法将从语言变为语言,但这是一个普遍的问题.
这有什么区别....
try
{
Console.WriteLine("Executing the try statement.");
throw new NullReferenceException();
}
catch (NullReferenceException e)
{
Console.WriteLine("{0} Caught exception #1.", e);
}
finally
{
Console.WriteLine("Executing finally block.");
}
Run Code Online (Sandbox Code Playgroud)
还有这个....
try
{
Console.WriteLine("Executing the try statement.");
throw new NullReferenceException();
}
catch (NullReferenceException e)
{
Console.WriteLine("{0} Caught exception #1.", e);
}
Console.WriteLine("Executing finally block.");
Run Code Online (Sandbox Code Playgroud)
我一直看到它被使用,所以我认为有一个很好的理由最终使用,但我无法弄清楚它是如何只是在声明之后放置代码,因为它仍然会运行.
有没有最终没有运行的场景?