summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--ranger/__main__.py29
1 files changed, 23 insertions, 6 deletions
diff --git a/ranger/__main__.py b/ranger/__main__.py
index 887f8e28..3bb857c3 100644
--- a/ranger/__main__.py
+++ b/ranger/__main__.py
@@ -154,13 +154,16 @@ def main():
 		sys.exit(1)
 
 	# Ensure that a utf8 locale is set.
-	if getdefaultlocale()[1] not in ('utf8', 'UTF-8'):
-		for locale in ('en_US.utf8', 'en_US.UTF-8'):
-			try: setlocale(LC_ALL, locale)
-			except: pass
-			else: break
+	try:
+		if getdefaultlocale()[1] not in ('utf8', 'UTF-8'):
+			for locale in ('en_US.utf8', 'en_US.UTF-8'):
+				try: setlocale(LC_ALL, locale)
+				except: pass
+				else: break
+			else: setlocale(LC_ALL, '')
 		else: setlocale(LC_ALL, '')
-	else: setlocale(LC_ALL, '')
+	except:
+		print("Warning: Unable to set locale.  Expect encoding problems.")
 
 	arg = parse_arguments()
 	ranger.arg = arg
@@ -187,6 +190,7 @@ def main():
 	else:
 		path = '.'
 
+	crash_exception = None
 	try:
 		# Initialize objects
 		EnvironmentAware._assign(Environment(path))
@@ -199,12 +203,25 @@ def main():
 		fm.initialize()
 		fm.ui.initialize()
 		fm.loop()
+	except Exception as e:
+		crash_exception = e
+		if not (arg.debug or arg.clean):
+			import traceback
+			dumpname = os.path.join(arg.confdir, 'traceback')
+			traceback.print_exc(file=open(dumpname, 'w'))
 	finally:
 		# Finish, clean up
 		try:
 			fm.ui.destroy()
 		except (AttributeError, NameError):
 			pass
+		if crash_exception:
+			print("Fatal: " + str(crash_exception))
+			if arg.debug or arg.clean:
+				raise crash_exception
+			else:
+				print("A traceback has been saved to " + dumpname)
+				print("Please include it in a bugreport.")
 
 
 if __name__ == '__main__':