标签: exception-handling

Java 8:Lambda-Streams,按方法过滤,具有异常

我在尝试Java 8的Lambda表达式时遇到了问题.通常它工作正常,但现在我有方法可以抛出IOException.最好看一下以下代码:

class Bank{
    ....
    public Set<String> getActiveAccountNumbers() throws IOException {
        Stream<Account> s =  accounts.values().stream();
        s = s.filter(a -> a.isActive());
        Stream<String> ss = s.map(a -> a.getNumber());
        return ss.collect(Collectors.toSet());
    }
    ....
}

interface Account{
    ....
    boolean isActive() throws IOException;
    String getNumber() throws IOException;
    ....
}
Run Code Online (Sandbox Code Playgroud)

问题是,它不能编译,因为我必须捕获isActive-和getNumber-Methods的可能例外.但即使我明确使用如下所示的try-catch-Block,它仍然无法编译,因为我没有捕获异常.所以要么JDK中存在错误,要么我不知道如何捕获这些异常.

class Bank{
    ....
    //Doesn't compile either
    public Set<String> getActiveAccountNumbers() throws IOException {
        try{
            Stream<Account> s =  accounts.values().stream();
            s = s.filter(a -> a.isActive());
            Stream<String> ss = s.map(a -> a.getNumber());
            return ss.collect(Collectors.toSet());
        }catch(IOException ex){
        } …
Run Code Online (Sandbox Code Playgroud)

java lambda exception-handling java-8

161
推荐指数
6
解决办法
12万
查看次数

在Python中记录未捕获的异常

如何通过logging模块而不是通过模块输出未捕获的异常stderr

我意识到这样做的最好方法是:

try:
    raise Exception, 'Throwing a boring exception'
except Exception, e:
    logging.exception(e)
Run Code Online (Sandbox Code Playgroud)

但是我的情况是如果在没有捕获到异常的情况下自动调用它会非常好logging.exception(...).

python logging exception-handling

157
推荐指数
8
解决办法
4万
查看次数

Spring Boot REST服务异常处理

我正在尝试建立一个大型REST服务服务器.我们使用的是Spring Boot 1.2.1 Spring 4.1.5和Java 8.我们的控制器正在实现@RestController和标准的@RequestMapping注释.

我的问题是Spring Boot为控制器异常设置了默认重定向/error.来自文档:

Spring Boot默认提供/错误映射,以合理的方式处理所有错误,并在servlet容器中注册为"全局"错误页面.

从使用Node.js编写REST应用程序多年来,对我来说,这对任何事情都是明智的.服务端点生成的任何异常都应在响应中返回.我无法理解为什么你会发送重定向到最有可能是Angular或JQuery SPA消费者的消费者,该消费者只是寻找答案而不能或不会对重定向采取任何行动.

我想要做的是设置一个全局错误处理程序,可以接受任何异常 - 有意地从请求映射方法抛出或由Spring自动生成(如果没有找到请求路径签名的处理程序方法,则为404),并返回标准格式化错误响应(400,500,503,404)到客户端没有任何MVC重定向.具体来说,我们将采用错误,使用UUID将其记录到NoSQL,然后使用JSON正文中日志条目的UUID向客户端返回正确的HTTP错误代码.

对于如何做到这一点,文档一直含糊不清.在我看来,你必须创建自己的ErrorController实现或以某种方式使用ControllerAdvice,但我看到的所有示例仍然包括将响应转发到某种错误映射,这没有帮助.其他示例表明,您必须列出要处理的每个Exception类型,而不是仅列出"Throwable"并获取所有内容.

任何人都可以告诉我我错过了什么,或指出我如何做到这一点的正确方向,而不建议Node.js更容易处理的链?

java rest spring exception-handling spring-boot

156
推荐指数
7
解决办法
21万
查看次数

Python"从使用中提升"

Python raiseraise fromPython 之间的区别是什么?

try:
    raise ValueError
except Exception as e:
    raise IndexError
Run Code Online (Sandbox Code Playgroud)

产量

Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "tmp.py", line 4, in <module>
    raise IndexError
IndexError
Run Code Online (Sandbox Code Playgroud)

try:
    raise ValueError
except Exception as e:
    raise IndexError from e
Run Code Online (Sandbox Code Playgroud)

产量

Traceback (most recent call last):
  File "tmp.py", line 2, in <module>
    raise ValueError …
Run Code Online (Sandbox Code Playgroud)

python syntax exception-handling python-3.x

154
推荐指数
3
解决办法
4万
查看次数

catch和finally子句抛出异常

关于大学的Java问题,有这段代码:

class MyExc1 extends Exception {}
class MyExc2 extends Exception {}
class MyExc3 extends MyExc2 {}

public class C1 {
    public static void main(String[] args) throws Exception {
        try {
            System.out.print(1);
            q();
        }
        catch (Exception i) {
            throw new MyExc2();
        }
        finally {
            System.out.print(2);
            throw new MyExc1();
        }
    }

    static void q() throws Exception {
        try {
            throw new MyExc1();
        }
        catch (Exception y) {
        }
        finally {
            System.out.print(3);
            throw new Exception();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我被要求提供输出.我回答13Exception in thread main …

java exception-handling exception

150
推荐指数
6
解决办法
13万
查看次数

在不中断程序的情况下在Python中引发警告

我正在处理如何在Python中引发警告而不必让程序崩溃/停止/中断的问题.

我使用以下简单函数,只检查用户是否传递了非零数字.如果用户传递零,程序应警告用户,但继续正常.它应该像下面的代码一样工作,但应该使用类Warning(),Error()或Exception()而不是手动打印警告.

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     print "WARNING: the input is 0!"
   return i
Run Code Online (Sandbox Code Playgroud)

如果我使用下面的代码并将0传递给函数,程序将崩溃并且永远不会返回值.相反,我希望程序正常继续,只是通知用户他将0传递给该函数.

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     raise Warning("the input is 0!")
   return i
Run Code Online (Sandbox Code Playgroud)

我希望能够测试是否已经通过unittest对其进行了测试.如果我只是打印出来的消息,我就无法在unittest中使用assertRaises来测试它.

python error-handling warnings exception-handling

147
推荐指数
4
解决办法
9万
查看次数

如何在Javascript中重新抛出异常,但保留堆栈?

在Javascript中,假设我想在异常发生时执行一些清理,但让异常继续向上传播,例如:

try {
  enterAwesomeMode();
  doRiskyStuff(); // might throw an exception
} catch (e) {
  leaveAwesomeMode();
  throw e;
}
doMoreStuff();
leaveAwesomeMode();
Run Code Online (Sandbox Code Playgroud)

这段代码的问题在于捕获和重新抛出异常会导致到那一点的堆栈跟踪信息丢失,因此如果随后再次捕获异常,堆栈上的堆栈更高,堆栈跟踪只会下降到re -扔.这很糟糕,因为它意味着它不包含实际抛出异常的函数.

事实证明,try..finally具有相同的行为,至少在Chrome中(也就是说,它不是精确地重新抛出问题,而是存在任何异常处理程序块.)

有没有人知道在Javascript中重新抛出异常但保留与之关联的堆栈跟踪的方法?如果不这样做,那么建议其他方法来添加异常安全的清理处理程序,同时在发生异常时捕获完整的堆栈跟踪?

感谢任何指针:)

javascript callstack exception-handling exception stack-trace

139
推荐指数
3
解决办法
4万
查看次数

即使你抛出一个新的异常,finally块也会运行吗?

在这个代码中,someVar即使执行catch块并抛出第二个异常,也会设置代码?

public void someFunction() throws Exception {
    try {
        //CODE HERE
    } catch (Exception e) {
        Log.e(TAG, "", e);
        throw new Exception(e);
    } finally {
        this.someVar= true;
    }
}
Run Code Online (Sandbox Code Playgroud)

java exception-handling

132
推荐指数
3
解决办法
6万
查看次数

使用不同的类型和消息重新引发异常,保留现有信息

我正在编写一个模块,并希望为它可以引发的异常建立一个统一的异常层次结构(例如,从一个FooError抽象类继承所有foo模块的特定异常).这允许模块的用户捕获这些特定异常并在需要时明确地处理它们.但是由于其他一些例外,该模块提出的许多例外都被提出; 例如,由于文件上的OSError而导致某些任务失败.

我需要的是"包装"捕获的异常,使其具有不同的类型和消息,以便通过捕获异常的任何信息在传播层次结构中进一步提供信息.但我不想丢失现有的类型,消息和堆栈跟踪; 这对于试图调试问题的人来说都是有用的信息.顶级异常处理程序并不好,因为我试图在异常进入传播堆栈之前修饰异常,并且顶级处理程序为时已晚.

这部分是通过foo从现有类型(例如class FooPermissionError(OSError, FooError))派生模块的特定异常类型来解决的,但这并不会使现有异常实例包装在新类型中更容易,也不会修改消息.

Python的PEP 3134 "异常链接和嵌入式回溯"讨论了Python 3.0中为"链接"异常对象所接受的更改,以指示在处理现有异常期间引发了新的异常.

我正在尝试做的是相关:我需要它也在早期的Python版本中工作,我需要它不是为了链接,而只是为了多态.这样做的正确方法是什么?

python polymorphism exception-handling

128
推荐指数
4
解决办法
4万
查看次数

如果首先可以避免异常,最好"尝试"某些东西并捕获异常或测试?

我应该测试if某些东西是有效的还是只是try为了捕获异常?

  • 有没有可靠的文件说一种方式是首选的?
  • 一种方式更pythonic

例如,我应该:

if len(my_list) >= 4:
    x = my_list[3]
else:
    x = 'NO_ABC'
Run Code Online (Sandbox Code Playgroud)

要么:

try:
    x = my_list[3]
except IndexError:
    x = 'NO_ABC'
Run Code Online (Sandbox Code Playgroud)

一些想法......
PEP 20说:

错误不应该默默地传递.
除非明确沉默.

应该使用a try而不是if被解释为默认传递的错误?如果是这样,你是否通过这种方式使用它来明确地对它进行静音,从而使它成为可能?


不是指的情况下,你只能做的事情1路; 例如:

try:
    import foo
except ImportError:
    import baz
Run Code Online (Sandbox Code Playgroud)

python if-statement exception-handling try-catch pep

125
推荐指数
5
解决办法
4万
查看次数