def _user_code_error_boundary(context, msg, **kwargs): ''' Wraps the execution of user-space code in an error boundary. This places a uniform policy around an user code invoked by the framework. This ensures that all user errors are wrapped in the SolidUserCodeExecutionError, and that the original stack trace of the user error is preserved, so that it can be reported without confusing framework code in the stack trace, if a tool author wishes to do so. This has been especially help in a notebooking context. ''' check.inst_param(context, 'context', ExecutionContext) check.str_param(msg, 'msg') try: yield except DagsterError as de: stack_trace = get_formatted_stack_trace(de) context.error(str(de), stack_trace=stack_trace) raise de except Exception as e: # pylint: disable=W0703 stack_trace = get_formatted_stack_trace(e) context.error(str(e), stack_trace=stack_trace) raise_from( DagsterUserCodeExecutionError( msg.format(**kwargs), user_exception=e, original_exc_info=sys.exc_info(), ), e, )
def _execution_step_error_boundary(context, step, msg, **kwargs): ''' Wraps the execution of user-space code in an error boundary. This places a uniform policy around an user code invoked by the framework. This ensures that all user errors are wrapped in the SolidUserCodeExecutionError, and that the original stack trace of the user error is preserved, so that it can be reported without confusing framework code in the stack trace, if a tool author wishes to do so. This has been especially help in a notebooking context. ''' check.inst_param(context, 'context', RuntimeExecutionContext) check.str_param(msg, 'msg') context.events.execution_plan_step_start(step.key) try: with time_execution_scope() as timer_result: yield context.events.execution_plan_step_success(step.key, timer_result.millis) except Exception as e: # pylint: disable=W0703 context.events.execution_plan_step_failure(step.key, sys.exc_info()) stack_trace = get_formatted_stack_trace(e) context.error(str(e), stack_trace=stack_trace) if isinstance(e, DagsterError): raise e else: raise_from( DagsterUserCodeExecutionError( msg.format(**kwargs), user_exception=e, original_exc_info=sys.exc_info()), e, )