我有一个监督Akka演员,它使用路由器将消息转发给工人演员。
我有一个封装了管理程序的类,当我调用该类的方法时,它“要求”管理程序做一些事情,然后我使用< code > await . result(the future)等待结果(没有结果我无法继续)。
如果worker抛出异常,我想重新启动抛出异常的worker,我想让调用包装类的代码捕获异常。
我向路由器构造函数传递了一个< code>OneForOneStrategy,它在出现< code >异常的情况下返回< code>RESTART。在worker的< code>postRestart方法中,我记录了重启,这样我就可以验证worker是否真的重启了。
当工作线程抛出异常时,它会重新启动,但异常会消失。询问主管的结果< code>Future包含一个异常,但它是一个< code > akka . pattern . asktimeoutexception ,仅在5秒后抛出,而不是20秒,这是我一直徘徊的隐式超时。异常实际上在工作线程启动后不到一秒钟就发生了。
问题1:如何从调用我的包装类的html" target="_blank">代码中的工作器中获取异常?
此外,工作者的接收方法如下:
def receive = {
case r: Request =>
val response = ??? //throws an exception sometimes
sender ! response
}
有些东西正在将异常记录到控制台,但这不是我的代码。堆栈跟踪为:
[ERROR] [02/11/2013 21:34:20.093] [MySystem-akka.actor.default-dispatcher-9]
[akka://MySystem/user/MySupervisor/MyRouter/$a] Something went wrong!
at myApp.Worker.$$anonfun$receive$1.applyOrElse(Source.scala:169)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425)
at akka.actor.ActorCell.invoke(ActorCell.scala:386)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230)
at akka.dispatch.Mailbox.run(Mailbox.scala:212)
at akka.dispatch.ForkJoinExecutorConfigurator$MailboxExecutionTask.exec(AbstractDispatcher.scala:502)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:262)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:975)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1478)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
Source.scala
的第169行是上面的接收
方法列表中显示的val响应=??
行。
问题2:谁将该异常记录到控制台,以及如何阻止它?
为了被告知你的一个孩子失败了,你需要
看着
孩子Terminated()
,其中包含对它的引用。像这样:
class ParentActor extends Actor {
// this is sample of how to watch for death of one of your children
val childActor = context.actorOf(Props[SomeService], "SomeService")
val dyingChild = context.watch(context.actorOf(childActor))
def receive = {
case Terminated(`dyingChild`) =>
println("dyingChild died")
case Terminated(terminatedActor) =>
println(s"This child just died $terminatedActor")
}
}
希望这有所帮助。
1)
try somethingThatCanFail() catch {
case e: Exception => sender ! Status.Failure(e); throw e
}
“告诉失败”会导致调用方获得包含异常的失败。抛出“e”会导致调用oneForOneStrategy,从而重新启动工作进程。
2)
是actor系统本身记录了故障,唯一让故障平静下来的方法是通过创建和配置您自己的LoggingAdapter来过滤掉故障,如下所述http://doc.akka.io/docs/akka/2.1.0/scala/logging.html有一张换这个的票https://www.assembla.com/spaces/akka/tickets/2824但它的目标是Akka 2.2
回答https://groups.google.com/forum/#!主题/akka用户/fenCvYu3HYE
我不知道该怎么办。 当我试图从解析器获取语法错误的数量时,它显示0。 编辑: 它返回null。
Blade 内置了 异常处理器,在开发者模式下它会将异常输出在前端页面,并在控制台打印堆栈信息,生产环境只打印在控制台。 有些时候不满足我们的需求,这时候就需要自定义异常处理了,比如针对某个自定义的异常进行特殊处理。 我们用一个例子来解释如何操作。 定义了一个名为 TipException 的运行时异常类,用于输出错误消息到前台。 按照上面对异常的处理情况这个异常的堆栈信息会被输出在控制台,生产环
任何方法都可以抛出不同类型的异常。这些异常可能是需要应用程序重新部署来解决的编程错误,或者是不需要重新部署但可以解决的暂时性错误。 Hangfire可以处理所有内部的(属于Hangfire本身)和相关的外部方法(任务,过滤器等)的异常,因此不会导致整个应用程序被关闭。所有内部异常都被记录(所以不要忘记 启用日志),最糟糕的情况是导致后台任务被暂停并延时重试 10 次。 当Hangfire遇到在执行
我们在编写程序的时候,经常需要对异常情况做处理。比如,当一个数试图除以 0 时,我们需要捕获这个异常情况并做处理。你可能会使用类似 if/else 的条件语句来对异常情况做判断,比如,判断除法的分母是否为零,如果为零,则打印错误信息。 这在某些简单的情况下是可以的,但是,在大多数时候,我们应该使用 Python 的异常处理机制。这主要有两方面的好处: 一方面,你可以选择忽略某些不重要的异常事件,或
异常处理可以使程序在流程上更加完善。 在 JavaScript 中可以使用 throw 抛出异常,使用 try ... catch 捕获错误。 1. throw throw 语句用来抛出一个用户自定义的异常。(MDN) throw 用于抛出一个异常,这种异常通常是程序出现了不符合预期的错误。 alert('出错前'); throw '发生了一个错误!'; alert('出错后'); 当出现
异常是指正常情况下不会发生的所谓「例外」的情况。在大部分情况下异常和错误可以当作同义词。 异常会发生的地方 程序的任何地方都有发生异常的可能性。 发生异常的时候,异常将被「投出(throw)」。 比如说,以下的脚本将会引起错误。 例: "3%0"!;//发生“除以0错误”的异常 虽然有像上例一样明显会发生异常的情况,但也有一些情况下,无法知道代码是否一定会发生异常。 异常的捕捉 使用
在 Hyperf 里,业务代码都运行在 Worker 进程 上,也就意味着一旦任意一个请求的业务存在没有捕获处理的异常的话,都会导致对应的 Worker 进程 被中断退出,这对服务而言也是不能接受的,捕获异常并输出合理的报错内容给客户端也是更加友好的。 我们可以通过对各个 server 定义不同的 异常处理器(ExceptionHandler),一旦业务流程存在没有捕获的异常,都会被传递到已注册的
publish/21-11/1-handler-exception-handler.html" publish/21-11/2-@exception-handler.html" publish/21-11/3-handling-standard-spring-mvc-exceptions.html" publish/21-11/4-annotating-business-exceptions-wi