simplify and modernize updatecache()
diff --git a/Lib/linecache.py b/Lib/linecache.py
index da62f0d..811f27f 100644
--- a/Lib/linecache.py
+++ b/Lib/linecache.py
@@ -72,13 +72,13 @@
 
     if filename in cache:
         del cache[filename]
-    if not filename or filename[0] + filename[-1] == '<>':
+    if not filename or (filename.startswith('<') and filename.endswith('>')):
         return []
 
     fullname = filename
     try:
         stat = os.stat(fullname)
-    except os.error, msg:
+    except OSError:
         basename = filename
 
         # Try for a __loader__, if available
@@ -115,20 +115,18 @@
                 fullname = os.path.join(dirname, basename)
             except (TypeError, AttributeError):
                 # Not sufficiently string-like to do anything useful with.
+                continue
+            try:
+                stat = os.stat(fullname)
+                break
+            except os.error:
                 pass
-            else:
-                try:
-                    stat = os.stat(fullname)
-                    break
-                except os.error:
-                    pass
         else:
             return []
     try:
-        fp = open(fullname, 'rU')
-        lines = fp.readlines()
-        fp.close()
-    except IOError, msg:
+        with open(fullname, 'rU') as fp:
+            lines = fp.readlines()
+    except IOError:
         return []
     if lines and not lines[-1].endswith('\n'):
         lines[-1] += '\n'