writedict: use write_atomic for exceptions

Also, fix calling code to handle InvalidLocation exceptions.
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 4173283..021191f 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -3726,9 +3726,7 @@
 			cfgfiledict.pop("IGNORE", None)
 			try:
 				writedict(cfgfiledict, self.vartree.dbapi._conf_mem_file)
-			except IOError as e:
-				if e.errno != errno.ENOENT:
-					raise
+			except InvalidLocation:
 				self.settings._init_dirs()
 				writedict(cfgfiledict, self.vartree.dbapi._conf_mem_file)
 
diff --git a/pym/portage/util/__init__.py b/pym/portage/util/__init__.py
index 0dff25f..94e4451 100644
--- a/pym/portage/util/__init__.py
+++ b/pym/portage/util/__init__.py
@@ -492,20 +492,14 @@
 def writedict(mydict,myfilename,writekey=True):
 	"""Writes out a dict to a file; writekey=0 mode doesn't write out
 	the key and assumes all values are strings, not lists."""
-	myfile = None
-	try:
-		myfile = atomic_ofstream(myfilename)
-		if not writekey:
-			for x in mydict.values():
-				myfile.write(x+"\n")
-		else:
-			for x in mydict:
-				myfile.write("%s %s\n" % (x, " ".join(mydict[x])))
-		myfile.close()
-	except IOError:
-		if myfile is not None:
-			myfile.abort()
-		raise
+	lines = []
+	if not writekey:
+		for v in mydict.values():
+			lines.append(v + "\n")
+	else:
+		for k, v in mydict.items():
+			lines.append("%s %s\n" % (k, " ".join(v)))
+	write_atomic(myfilename, "".join(lines))
 
 def shlex_split(s):
 	"""