Jupyter magic to handle notebook exceptions

前端 未结 5 674
北恋
北恋 2020-12-16 11:22

I have a few long-running experiments in my Jupyter Notebooks. Because I don\'t know when they will finish, I add an email function to the last cell of the notebook, so I au

5条回答
  •  自闭症患者
    2020-12-16 12:10

    Why exec is not always the solution

    It's some years later and I had a similar issue trying to handle errors with Jupyter magics. However, I needed variables to persist in the actual Jupyter notebook.

    %%try_except print
    a = 12
    raise ValueError('test')
    

    In this example, I want the error to print (but could be anything such as e-mail as in the opening post), but also a == 12 to be true in the next cell. For that reason, the method exec suggested does not work when you define the magic in a different file. The solution I found is to use the IPython functionalities.

    How you can solve it

    from IPython.core.magic import line_magic, cell_magic, line_cell_magic, Magics, magics_class
    
    
    @magics_class
    class CustomMagics(Magics):
        @cell_magic
        def try_except(self, line, cell):
            """ This magic wraps a cell in try_except functionality """  
            try:
                self.shell.ex(cell)  # This executes the cell in the current namespace
            except Exception as e:
                if ip.ev(f'callable({how})'):  # check we have a callable handler
                    self.shell.user_ns['error'] = e  # add error to namespace
                    ip.ev(f'{how}(error)')  # call the handler with the error
                else:
                    raise e
    
    
    # Register
    from IPython import get_ipython
    ip = get_ipython()
    ip.register_magics(CustomMagics)
    

提交回复
热议问题