from artiq.experiment import *
from artiq.language.core import TerminationRequested

class ExceptionDemo(EnvExperiment):
    def build(self):
        self.setattr_device("core")
        self.setattr_device("led0")

    def foo(self):
        print("raise error")
        raise Exception

    def termination(self):
        raise TerminationRequested

    @rpc
    def remote(self):
        raise Exception

    @kernel
    def run(self):
        self.core.reset()
        try:
            try:
                self.foo()
            except ValueError as e:
                print("should not trigger this")
        except:
            print("catch all")

        try:
            self.remote()
        except:
            print("Error!")

        print("Uncaught error at last")
        self.termination()