标签: finally

java尝试finally块来关闭流

我想在finally块中关闭我的流,但它会抛出一个IOException所以我似乎必须tryfinally块中嵌套另一个块才能关闭流.这是正确的方法吗?看起来有点笨重.

这是代码:

 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)

java file-io finally try-catch stream

31
推荐指数
5
解决办法
3万
查看次数

java:尝试finally块执行

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块未执行?任何人都可以帮助我吗?

java finally try-catch

31
推荐指数
2
解决办法
2624
查看次数

为什么C#不支持首次通过异常过滤?

注意:这不是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块可能会执行以下任何操作:

  • 无害地修改程序状态(phew,lucky).
  • 在客户的数据中删除重要的东西,因为程序状态被搞砸到了未知程度.
  • 伪装或破坏我们需要诊断问题的重要证据 - 特别是如果我们谈论调用本机代码.
  • 抛出另一个例外,增加了一般的困惑和痛苦.

请注意,using语句和C++/CLI析构函数构建在try/上finally,因此它们也会受到影响.

很明显,过滤异常的catch/ throw模式并不好.实际需要的是一种通过策略过滤异常而不实际捕获它们从而触发finally块执行的方法,除非我们找到一个告诉我们异常可以安全恢复的策略.

CLR团队最近在博客上写了这篇文章:

结果是我们必须在VB.NET中编写一个辅助函数,以允许我们从C#访问这个重要的功能.存在问题的一个重要线索就是BCL中有代码可以做到这一点.很多人都写过关于这样做的博客,但他们很少提及关于try/ finallyblocks 的事情,这是杀手.

我想知道的是:

  • 是否有人在C#团队收到有关此主题的公开声明或直接电子邮件?
  • 是否有任何现有的Microsoft Connect建议要求这样做?我听说过他们的谣言,但没有一个可能的关键词出现了什么.

更新:如上所述,我已经搜索过Microsoft Connect而没有找到任何内容.我也(不出所料)谷歌搜索.我只找到人们解释为什么他们需要这个功能,或者指出它在VB.NET中优势,或者毫无结果地希望它将 …

c# vb.net exception finally

30
推荐指数
1
解决办法
2253
查看次数

使用C++ lambda正确实现finally块

我想finally在我的C++程序中实现一个块,如果不是原生设施,那么该语言肯定有工具可以实现.我想知道最好的方法是什么?

c++ finally c++11

27
推荐指数
2
解决办法
5427
查看次数

回来吃异常

我发现以下行为至少很奇怪:

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)

returnfinally子句中使用时,异常消失.那是一个错误吗?有记录吗?

但真正的问题(以及我将标记为正确的答案)是:
python开发人员允许这种奇怪行为的理由是什么?

python return exception finally

26
推荐指数
3
解决办法
3025
查看次数

好奇的C#使用语句扩展

我跑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)

c# using finally try-catch expansion

26
推荐指数
2
解决办法
3385
查看次数

Angular 6/Rxjs - 基础知识:可观察到的成功,错误,最后

我正在构建一个最新的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中,我不明白为什么一切都那么复杂,看起来不对.

我可以找到两种方法来做同上面的事情:

  1. 满管

    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)

由于我们必须使用管道进行最终化,我不妨使用管道来处理所有事情,我认为最好的做法是让一切都按照相同的顺序排列.但现在我们不得不抛出一些东西,称之为"不太容易理解",我不喜欢这样.

  1. 半管所以我尝试了另一个想法,只有我需要的管道(敲定),我保留订阅回调.

    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,请,我想了解如何处理新的东西)

finally observable rxjs angular

26
推荐指数
2
解决办法
3万
查看次数

在Java中,是否保证要调用"finally"块(在main方法中)?

我是一个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和应用程序继续运行时退出的线程的可能性非常有用,因为即使现在我看起来也很明显,我没有想到它.

java error-handling finally

24
推荐指数
3
解决办法
2万
查看次数

'Finally'等效于Python中的If/Elif语句

Python finallyif/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仅在没有满足其他条件的情况下运行,但只有在满足其他条件时才会运行.

python finally

22
推荐指数
5
解决办法
3万
查看次数

在try/catch/finally中"finally"的目的是什么

语法将从语言变为语言,但这是一个普遍的问题.

这有什么区别....

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)

我一直看到它被使用,所以我认为有一个很好的理由最终使用,但我无法弄清楚它是如何只是在声明之后放置代码,因为它仍然会运行.

有没有最终没有运行的场景?

javascript c# exception-handling finally

21
推荐指数
3
解决办法
5109
查看次数