| 27 | return wrap |
| 28 | |
| 29 | def write_user_exception(filename, stream_err_output, num_lines_offset_trace=0): |
| 30 | import sys |
| 31 | import traceback |
| 32 | import inspect |
| 33 | (t, v, tb) = sys.exc_info() |
| 34 | name = t.__name__ |
| 35 | record_error = False |
| 36 | |
| 37 | if name in ['SyntaxError', 'IndentationError']: |
| 38 | syntax_error_values = v.args |
| 39 | user_line_number = syntax_error_values[1][1] - num_lines_offset_trace |
| 40 | error_message = "%s: %s\n\tFile: %s, line %s column %s\n\t%s" % \ |
| 41 | (name, |
| 42 | syntax_error_values[0], |
| 43 | syntax_error_values[1][0], |
| 44 | user_line_number, |
| 45 | syntax_error_values[1][2], |
| 46 | syntax_error_values[1][3]) |
| 47 | else: |
| 48 | error_message = "%s: %s\n" % (name, v) |
| 49 | user_line_number = None |
| 50 | while 1: |
| 51 | e_file_name = tb.tb_frame.f_code.co_filename |
| 52 | if e_file_name.find(filename) > 0: |
| 53 | record_error = True |
| 54 | if not record_error: |
| 55 | if not tb.tb_next: |
| 56 | break |
| 57 | tb = tb.tb_next |
| 58 | continue |
| 59 | |
| 60 | line_number = tb.tb_lineno |
| 61 | mod = inspect.getmodule(tb) |
| 62 | if mod: |
| 63 | lines, offset = inspect.getsourcelines(mod) |
| 64 | line = lines[line_number - offset - 1] |
| 65 | else: |
| 66 | #Useful to catch exceptions with an invalid module (like syntax |
| 67 | #errors) |
| 68 | lines, offset = inspect.getsourcelines(tb.tb_frame) |
| 69 | if (line_number - 1) >= len(lines): |
| 70 | line = "Unknown Line" |
| 71 | else: |
| 72 | line = lines[line_number - 1] |
| 73 | |
| 74 | user_line_number = line_number - num_lines_offset_trace |
| 75 | func_name = tb.tb_frame.f_code.co_name |
| 76 | error_message += 'File %s, line %s, in %s\n\t%s\n' % \ |
| 77 | (e_file_name, user_line_number, func_name, line) |
| 78 | if not tb.tb_next: |
| 79 | break |
| 80 | tb = tb.tb_next |
| 81 | if name in ['UnicodeEncodeError']: |
| 82 | error_message += "\nTo print a unicode string in your udf use encode('utf-8'). Example: \n\tprint 'Example'.encode('utf-8')" |
| 83 | if user_line_number: |
| 84 | stream_err_output.write("%s\n" % user_line_number) |
| 85 | stream_err_output.write("%s\n" % error_message) |