error.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package rx
  2. const invalid_no_except = "An effect that assumed to be a no-exception effect has thrown an error"
  3. func Throw(e Object) Observable {
  4. return Observable { func(_ Scheduler, ob *observer) {
  5. ob.error(e)
  6. } }
  7. }
  8. func (e Observable) NoExcept() Observable {
  9. return Observable { func(sched Scheduler, ob *observer) {
  10. sched.run(e, &observer {
  11. context: ob.context,
  12. next: ob.next,
  13. error: func(_ Object) {
  14. panic(invalid_no_except)
  15. },
  16. complete: ob.complete,
  17. })
  18. } }
  19. }
  20. func (e Observable) Catch(f func(Object) Observable) Observable {
  21. return Observable { func(sched Scheduler, ob *observer) {
  22. sched.run(e, &observer {
  23. context: ob.context,
  24. next: func(x Object) {
  25. ob.next(x)
  26. },
  27. error: func(e Object) {
  28. var caught_effect = f(e)
  29. sched.run(caught_effect, ob)
  30. },
  31. complete: func() {
  32. ob.complete()
  33. },
  34. })
  35. } }
  36. }
  37. func (e Observable) CatchComplete(f func(Object) Observable) Observable {
  38. return Observable { func(sched Scheduler, ob *observer) {
  39. var handler_ob = &observer {
  40. context: background,
  41. next: func(Object) {},
  42. error: func(Object) {},
  43. complete: func() {},
  44. }
  45. sched.run(e, &observer {
  46. context: ob.context,
  47. next: func(x Object) {
  48. ob.next(x)
  49. },
  50. error: func(e Object) {
  51. var handler = f(e)
  52. sched.run(handler, handler_ob)
  53. ob.complete()
  54. },
  55. complete: func() {
  56. ob.complete()
  57. },
  58. })
  59. } }
  60. }
  61. func (e Observable) CatchRetry(f func(Object) Observable) Observable {
  62. var try Observable
  63. try = Observable { func(sched Scheduler, ob *observer) {
  64. sched.run(e, &observer {
  65. context: ob.context,
  66. next: func(x Object) {
  67. ob.next(x)
  68. },
  69. error: func(e Object) {
  70. var caught_effect =
  71. f(e).NoExcept().Then(func(retry Object) Observable {
  72. if retry.(bool) {
  73. return try
  74. } else {
  75. return Throw(e)
  76. }
  77. })
  78. sched.run(caught_effect, ob)
  79. },
  80. complete: func() {
  81. ob.complete()
  82. },
  83. })
  84. } }
  85. return try
  86. }
  87. func (e Observable) CatchThrow(error_mapper func(Object)Object) Observable {
  88. return Observable { func(sched Scheduler, ob *observer) {
  89. sched.run(e, &observer {
  90. context: ob.context,
  91. next: ob.next,
  92. error: func(err Object) {
  93. ob.error(error_mapper(err))
  94. },
  95. complete: ob.complete,
  96. })
  97. } }
  98. }