Handle an exception that occurs inside an aspect-proxied component call.

← Design Patterns and Idioms · Ref: Q1117

Exceptions propagate through aspects unchanged:

  calc as Calculator!
  try
    result <- calc.divide(0)
    stdout.println(`100 / 0 = ${result}`)
  catch
    -> ex as Exception
    stdout.println(`caught: ${ex.reason()}`)

A silent aspect does not catch or modify exceptions -- they pass straight through. In the example the component throws Exception("zero divisor") for a divisor of 0 and the caller's try/catch handles it exactly as if no aspect were present.

See Q1115 for basic aspect. See Q1116 for aspect with constructor.

Example

defines module qa.designpatterns.aspectexception

  defines component

    Calculator as abstract
      divide() as abstract
        -> divisor as Integer
        <- result as Integer?

    CheckedCalculator is Calculator
      override divide()
        -> divisor as Integer
        <- result as Integer?
        if divisor == 0
          throw Exception("zero divisor")
        result: 100 / divisor

  defines class

    AuditAspect extends Aspect
      default operator ?

  defines application

    ExceptionApp
      register CheckedCalculator() as Calculator with aspect of AuditAspect()

  defines program

    AspectExceptionDemo() with application of ExceptionApp
      stdout <- Stdout()
      calc as Calculator!

      //Normal call through aspect
      result <- calc.divide(10)
      stdout.println(`100 / 10 = ${result}`)

      //An exception thrown by the component passes through the aspect to this try/catch
      try
        failed <- calc.divide(0)
        stdout.println(`100 / 0 = ${failed}`)
      catch
        -> ex as Exception
        stdout.println(`caught: ${ex.reason()}`)
Other ways to ask this
  • I need to understand what happens when a proxied method throws through an aspect
  • In Spring AOP exceptions propagate through advice. Show the EK9 aspect exception path
  • Given a component that throws, verify the exception passes through the aspect to the caller
  • Test exception propagation through an aspect proxy

Coming from another language?

Spring AOP: exceptions propagate through @Around advice unless caught. AspectJ: same propagation. EK9: same — exceptions pass through the aspect proxy transparently.

Keywords: aspect, proxy, try catch, exception, error, propagate