设为首页 加入收藏

TOP

FunDA(17)- 示范:异常处理与事后处理 - Exceptions handling and Finalizers(二)
2017-10-09 14:23:36 】 浏览:4628
Tags:FunDA 示范 异常 处理 事后 Exceptions handling and Finalizers
(id - 3) fda_next(StateModel(idx, name)) } catch { case e: Exception => //pass an error row fda_next(DivideZeroError(s"Divide by zero excption at ${id}",e)) } case m@_ => fda_next(m) } }

必须修改trackRows能分辨DivideZeroError行:

  def trackRows: FDAUserTask[FDAROW] = row => { row match { case m@StateModel(id,name) => println(s"State: $id $name") println( "----------------") fda_next(m) case DivideZeroError(msg, e) => //error row
        println(s"***Error:$msg***") fda_skip case m@_ => fda_next(m) } }

运算下面的程序:

  val s = streamState.take(5).appendTask(catchError).appendTask(trackRows) val s1 = s.onError {case e: Exception => println(s"Caught Error in streamState!!![${e.getMessage}]"); fda_appendRow(FDANullRow)} s1.startRun

产生下面的结果:

State: 0 Alabama ---------------- State: -2 Alaska ----------------
***Error:Divide by zero excption at 3*** State: 4 Arkansas ---------------- State: 2 California ----------------
***Finally*** the end of streamState!!! Process finished with exit code 0

没有出现异常中断,捕获并处理了自定义异常,并且调用了事后处理程序finalizer。

下面就是这次示范的源代码:

import slick.jdbc.H2Profile.api._ import com.bayakala.funda.samples.SlickModels._ import com.bayakala.funda._ import api._ import scala.language.implicitConversions object ExceptionsAndFinalizers extends App { val db = Database.forConfig("h2db") implicit def toState(row: StateTable#TableElementType) = StateModel(row.id,row.name) val viewLoader = FDAViewLoader(slick.jdbc.H2Profile)(toState _) val streamLoader = FDAStreamLoader(slick.jdbc.H2Profile)(toState _) val stateSeq = viewLoader.fda_typedRows(StateQuery.result)(db).toSeq val viewState = fda_staticSource(stateSeq)(println("***Finally*** the end of viewState!!!")) val streamState = streamLoader.fda_typedStream(StateQuery.result)(db)(64,64)(println("***Finally*** the end of streamState!!!")) /* viewState.startRun viewState.take(2).startRun streamState.startRun streamState.take(3).startRun // ***Finally*** the end of viewState!!! // ***Finally*** the end of viewState!!! // ***Finally*** the end of streamState!!! // ***Finally*** the end of streamState!!! */ def trackRows: FDAUserTask[FDAROW] = row => { row match { case m@StateModel(id,name) => println(s"State: $id $name") println( "----------------") fda_next(m) case DivideZeroError(msg, e) => //error row
        println(s"***Error:$msg***") fda_skip case m@_ => fda_next(m) } } def errorRow: FDAUserTask[FDAROW] = row => { row match { case StateModel(id,name) => val idx = id / (id - 3) fda_next(StateModel(idx,name)) case m@_ => fda_next(m) } } case class DivideZeroError(msg: String, e: Exception) extends FDAROW def catchError: FDAUserTask[FDAROW] = row => { row match { case StateModel(id,name) =>
        try { val idx = id / (id - 3) fda_next(StateModel(idx, name)) } catch { case e: Exception => //pass an error row
            fda_next(DivideZeroError(s"Divide by zero excption at ${id}",e)) } case m@_ => fda_next(m) } } /* streamState.appendTask(errorRow).appendTask(trackRows).startRun // State: 0 Alabama // ---------------- // State: -2 Alaska // ---------------- // Exception in thread "main" java.lang.ArithmeticException: / by zero // at examples.ExceptionsAndFinalizers$$anonfun$errorRow$1.appl
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇FunDA(16)- 示范:整合并行运.. 下一篇Scala基本语法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目