printobject now returns an error code
diff --git a/Include/object.h b/Include/object.h
index 5a93000..750cd80 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -162,7 +162,7 @@
 	/* Methods to implement standard operations */
 	
 	void (*tp_dealloc) FPROTO((object *));
-	void (*tp_print) FPROTO((object *, FILE *, int));
+	int (*tp_print) FPROTO((object *, FILE *, int));
 	object *(*tp_getattr) FPROTO((object *, char *));
 	int (*tp_setattr) FPROTO((object *, char *, object *));
 	int (*tp_compare) FPROTO((object *, object *));
@@ -180,7 +180,7 @@
 #define is_typeobject(op) ((op)->ob_type == &Typetype)
 
 /* Generic operations on objects */
-extern void printobject PROTO((object *, FILE *, int));
+extern int printobject PROTO((object *, FILE *, int));
 extern object * reprobject PROTO((object *));
 extern int cmpobject PROTO((object *, object *));
 extern object *getattr PROTO((object *, char *));
diff --git a/Modules/stdwinmodule.c b/Modules/stdwinmodule.c
index 494b15e..9b436af 100644
--- a/Modules/stdwinmodule.c
+++ b/Modules/stdwinmodule.c
@@ -1286,13 +1286,14 @@
 	free((char *)wp);
 }
 
-static void
+static int
 window_print(wp, fp, flags)
 	windowobject *wp;
 	FILE *fp;
 	int flags;
 {
 	fprintf(fp, "<window titled '%s'>", getstringvalue(wp->w_title));
+	return 0;
 }
 
 static object *
diff --git a/Python/pythonmain.c b/Python/pythonmain.c
index b855520..9fa1a58 100644
--- a/Python/pythonmain.c
+++ b/Python/pythonmain.c
@@ -289,10 +289,12 @@
 	object *exception, *v;
 	err_get(&exception, &v);
 	fprintf(stderr, "Unhandled exception: ");
-	printobject(exception, stderr, PRINT_RAW);
+	if (printobject(exception, stderr, PRINT_RAW) != 0)
+		err_clear();
 	if (v != NULL && v != None) {
 		fprintf(stderr, ": ");
-		printobject(v, stderr, PRINT_RAW);
+		if (printobject(v, stderr, PRINT_RAW) != 0)
+			err_clear();
 	}
 	fprintf(stderr, "\n");
 	XDECREF(exception);
diff --git a/Python/traceback.c b/Python/traceback.c
index 0b6904f..e71f6fa 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -186,12 +186,14 @@
 	FILE *fp;
 {
 	while (tb != NULL) {
-		if (intrcheck()) {
-			fprintf(fp, "[interrupted]\n");
+		if (intrcheck())
+			break;
+		fprintf(fp, "  File \"");
+		if (printobject(tb->tb_frame->f_code->co_filename,
+				fp, PRINT_RAW) != 0) {
+			err_clear();
 			break;
 		}
-		fprintf(fp, "  File \"");
-		printobject(tb->tb_frame->f_code->co_filename, fp, PRINT_RAW);
 		fprintf(fp, "\", line %d\n", tb->tb_lineno);
 		tb_displayline(fp,
 		     getstringvalue(tb->tb_frame->f_code->co_filename),