def handle_error(self, e): """ Handle a BASIC error through error message. """ # not handled by ON ERROR, stop execution console.write_error_message(e.message, program.get_line_number(e.pos)) state.basic_state.error_handle_mode = False state.basic_state.parse_mode = False state.basic_state.input_mode = False # special case: syntax error if e.err == error.STX: # for some reason, err is reset to zero by GW-BASIC in this case. state.basic_state.errn = 0 if e.pos != -1: # line edit gadget appears state.basic_state.edit_prompt = (program.get_line_number(e.pos), e.pos+1)
def handle_error(e): """ Handle a BASIC error through error message. """ # not handled by ON ERROR, stop execution console.write_error_message(e.message, program.get_line_number(e.pos)) state.basic_state.error_handle_mode = False state.basic_state.execute_mode = False state.basic_state.input_mode = False # special case: syntax error if e.err == error.STX: # for some reason, err is reset to zero by GW-BASIC in this case. state.basic_state.errn = 0 if e.pos != -1: # line edit gadget appears state.basic_state.edit_prompt = (program.get_line_number(e.pos), e.pos+1)
def handle_error(s): """ Handle a BASIC error through trapping or error message. """ error.set_err(s) # not handled by ON ERROR, stop execution console.write_error_message(error.get_message(s.err), program.get_line_number(s.pos)) state.basic_state.error_handle_mode = False state.basic_state.execute_mode = False state.basic_state.input_mode = False # special case: syntax error if s.err == 2: # for some reason, err is reset to zero by GW-BASIC in this case. state.basic_state.errn = 0 if s.pos != -1: # line edit gadget appears state.basic_state.edit_prompt = (program.get_line_number(s.pos), state.basic_state.bytecode.tell())
def value_erl(ins): """ ERL: get line number of last error. """ if state.basic_state.errp == 0: erl = 0 elif state.basic_state.errp == -1: erl = 65535 else: erl = program.get_line_number(state.basic_state.errp) return fp.pack(fp.Single.from_int(erl))
def bluescreen(e): """ Display a modal exception message. """ state.console_state.screen.screen(0, 0, 0, 0, new_width=80) console.clear() console.init_mode() exc_type, exc_value, exc_traceback = sys.exc_info() # log the standard python error logging.error(''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))) # format the error more readably on the screen state.console_state.screen.set_border(4) state.console_state.screen.set_attr(0x70) console.write_line('EXCEPTION') state.console_state.screen.set_attr(15) if state.basic_state.run_mode: state.basic_state.bytecode.seek(-1, 1) program.edit(program.get_line_number(state.basic_state.bytecode.tell()), state.basic_state.bytecode.tell()) console.write_line('\n') else: state.basic_state.direct_line.seek(0) console.write_line(str(tokenise.detokenise_compound_statement(state.basic_state.direct_line)[0])+'\n') stack = traceback.extract_tb(exc_traceback) for s in stack[-4:]: stack_line = '{0}:{1}, {2}'.format( os.path.split(s[0])[-1], s[1], s[2]) stack_line_2 = ' {0}'.format(s[3]) state.console_state.screen.set_attr(15) console.write_line(stack_line) state.console_state.screen.set_attr(7) console.write_line(stack_line_2) exc_message = traceback.format_exception_only(exc_type, exc_value)[0] state.console_state.screen.set_attr(15) console.write('{0}:'.format(exc_type.__name__)) state.console_state.screen.set_attr(7) console.write_line(' {0}'.format(str(exc_value))) state.console_state.screen.set_attr(0x70) console.write_line( '\nThis is a bug in PC-BASIC.') state.console_state.screen.set_attr(7) console.write( 'Sorry about that. Please send the above messages to the bugs forum\nby e-mail to ') state.console_state.screen.set_attr(15) console.write( '*****@*****.**') state.console_state.screen.set_attr(7) console.write( ' or by filing a bug\nreport at ') state.console_state.screen.set_attr(15) console.write( 'https://github.com/robhagemans/pcbasic/issues') state.console_state.screen.set_attr(7) console.write_line( '. Please include') console.write_line('as much information as you can about what you were doing and how this happened.') console.write_line('Thank you!') state.console_state.screen.set_attr(7) flow.set_pointer(False)
def handle_break(self, e): """ Handle a Break event. """ # print ^C at current position if not state.basic_state.input_mode and not e.stop: console.write('^C') # if we're in a program, save pointer pos = -1 if state.basic_state.run_mode: pos = state.basic_state.bytecode.tell() state.basic_state.stop = pos console.write_error_message(e.message, program.get_line_number(pos)) state.basic_state.parse_mode = False state.basic_state.input_mode = False
def handle_break(e): """ Handle a Break event. """ # print ^C at current position if not state.basic_state.input_mode and not e.stop: console.write('^C') # if we're in a program, save pointer if state.basic_state.run_mode: console.write_error_message("Break", program.get_line_number(e.pos)) state.basic_state.stop = state.basic_state.bytecode.tell() else: console.write_error_message("Break", -1) state.basic_state.execute_mode = False state.basic_state.input_mode = False
def value_erl(ins): """ ERL: get line number of last error. """ return fp.pack(fp.Single.from_int(program.get_line_number(state.basic_state.errp)))
def value_erl(ins): """ ERL: get line number of last error. """ return fp.pack( fp.Single.from_int(program.get_line_number(state.basic_state.errp)))