[PATCH 05/13] trivial: Remove broad exceptions where possible

Stephen Finucane stephenfinucane at hotmail.com
Tue Sep 20 08:38:53 AEST 2016


The are two somewhat significant changes:

* The behavior of 'Bundle.add_patch' is changed. Previously this would
  raise an exception if the provided patch already existed in the
  bundle. Since this code was only used in one location, change this to
  return the BundlePatch if valid else None and change the calling code
  to check return value instead of catching the exception.
* Use a context manager to open the config file in pwclient. This loses
  a little granularity in error messaging, but this is a worthy
  compromise.

Signed-off-by: Stephen Finucane <stephenfinucane at hotmail.com>
---
 patchwork/bin/pwclient            | 11 ++---------
 patchwork/models.py               |  4 +++-
 patchwork/notifications.py        |  3 ++-
 patchwork/paginator.py            |  4 ++--
 patchwork/templatetags/listurl.py |  6 +++---
 patchwork/views/__init__.py       |  6 +++---
 patchwork/views/bundle.py         | 15 ++++-----------
 patchwork/views/mail.py           |  4 ++--
 patchwork/views/patch.py          | 14 +++++++-------
 patchwork/views/user.py           |  4 ++--
 patchwork/views/xmlrpc.py         |  6 +++---
 11 files changed, 33 insertions(+), 44 deletions(-)

diff --git a/patchwork/bin/pwclient b/patchwork/bin/pwclient
index 791c511..b63db53 100755
--- a/patchwork/bin/pwclient
+++ b/patchwork/bin/pwclient
@@ -294,17 +294,10 @@ def action_get(rpc, patch_id):
         fname = "%s.%d" % (base_fname, i)
         i += 1
 
-    try:
-        f = open(fname, "w")
-    except:
-        sys.stderr.write("Unable to open %s for writing\n" % fname)
-        sys.exit(1)
-
-    try:
+    with open(fname, 'w') as f:
         f.write(unicode(s).encode("utf-8"))
-        f.close()
         print('Saved patch to %s' % fname)
-    except:
+    except IOError:
         sys.stderr.write("Failed to write to %s\n" % fname)
         sys.exit(1)
 
diff --git a/patchwork/models.py b/patchwork/models.py
index b1c6d8d..4c0aa88 100644
--- a/patchwork/models.py
+++ b/patchwork/models.py
@@ -580,12 +580,14 @@ class Bundle(models.Model):
         # see if the patch is already in this bundle
         if BundlePatch.objects.filter(bundle=self,
                                       patch=patch).count():
-            raise Exception('patch is already in bundle')
+            return
 
         bp = BundlePatch.objects.create(bundle=self, patch=patch,
                                         order=max_order + 1)
         bp.save()
 
+        return bp
+
     def public_url(self):
         if not self.public:
             return None
diff --git a/patchwork/notifications.py b/patchwork/notifications.py
index 5420401..16152ef 100644
--- a/patchwork/notifications.py
+++ b/patchwork/notifications.py
@@ -19,6 +19,7 @@
 
 import datetime
 import itertools
+import smtplib
 
 from django.conf import settings
 from django.contrib.auth.models import User
@@ -87,7 +88,7 @@ def send_notifications():
 
         try:
             message.send()
-        except Exception as ex:
+        except smtplib.SMTPException as ex:
             errors.append((recipient, ex))
             continue
 
diff --git a/patchwork/paginator.py b/patchwork/paginator.py
index e31c76c..3da2cd0 100644
--- a/patchwork/paginator.py
+++ b/patchwork/paginator.py
@@ -55,9 +55,9 @@ class Paginator(paginator.Paginator):
         super(Paginator, self).__init__(objects, items_per_page)
 
         try:
-            page_no = int(request.GET.get('page'))
+            page_no = int(request.GET.get('page', 1))
             self.current_page = self.page(int(page_no))
-        except Exception:
+        except ValueError:
             page_no = 1
             self.current_page = self.page(page_no)
 
diff --git a/patchwork/templatetags/listurl.py b/patchwork/templatetags/listurl.py
index 3f28f71..eea788e 100644
--- a/patchwork/templatetags/listurl.py
+++ b/patchwork/templatetags/listurl.py
@@ -63,9 +63,9 @@ class ListURLNode(template.defaulttags.URLNode):
 
         params = []
         try:
-            qs_var = template.Variable('list_view.params')
-            params = dict(qs_var.resolve(context))
-        except Exception:
+            qs_var = template.Variable('list_view.params').resolve(context)
+            params = dict(qs_var)
+        except TypeError, template.VariableDoesNotExist:
             pass
 
         for (k, v) in self.params.items():
diff --git a/patchwork/views/__init__.py b/patchwork/views/__init__.py
index e1e40a8..98e451d 100644
--- a/patchwork/views/__init__.py
+++ b/patchwork/views/__init__.py
@@ -173,13 +173,13 @@ def set_bundle(request, project, action, data, patches, context):
             try:
                 bp = BundlePatch.objects.get(bundle=bundle, patch=patch)
                 bp.delete()
+            except BundlePatch.DoesNotExist:
+                pass
+            else:
                 messages.success(
                     request,
                     "Patch '%s' removed from bundle %s\n" % (patch.name,
                                                              bundle.name))
-            # TODO(stephenfin): Make this less broad
-            except Exception:
-                pass
 
     bundle.save()
 
diff --git a/patchwork/views/bundle.py b/patchwork/views/bundle.py
index ba569e2..e717429 100644
--- a/patchwork/views/bundle.py
+++ b/patchwork/views/bundle.py
@@ -48,10 +48,7 @@ def setbundle(request):
             patch_id = request.POST.get('patch_id', None)
             if patch_id:
                 patch = get_object_or_404(Patch, id=patch_id)
-                try:
-                    bundle.append_patch(patch)
-                except Exception:
-                    pass
+                bundle.append_patch(patch)
             bundle.save()
         elif action == 'add':
             bundle = get_object_or_404(Bundle,
@@ -66,11 +63,8 @@ def setbundle(request):
                 patch_ids = get_patch_ids(request.POST)
 
             for patch_id in patch_ids:
-                try:
-                    patch = Patch.objects.get(id=patch_id)
-                    bundle.append_patch(patch)
-                except:
-                    pass
+                patch = Patch.objects.get(id=patch_id)
+                bundle.append_patch(patch)
 
             bundle.save()
         elif action == 'delete':
@@ -78,11 +72,10 @@ def setbundle(request):
                 bundle = Bundle.objects.get(owner=request.user,
                                             id=request.POST['id'])
                 bundle.delete()
-            except Exception:
+            except Bundle.DoesNotExist:
                 pass
 
             bundle = None
-
     else:
         bundle = get_object_or_404(Bundle, owner=request.user,
                                    id=request.POST['bundle_id'])
diff --git a/patchwork/views/mail.py b/patchwork/views/mail.py
index 3695e5b..8744d79 100644
--- a/patchwork/views/mail.py
+++ b/patchwork/views/mail.py
@@ -17,7 +17,7 @@
 # along with Patchwork; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-from __future__ import absolute_import
+import smtplib
 
 from django.conf import settings as conf_settings
 from django.core.mail import send_mail
@@ -114,7 +114,7 @@ def _optinout(request, action, description):
         send_mail('Patchwork %s confirmation' % description, mail,
                   conf_settings.DEFAULT_FROM_EMAIL, [email])
         context['email_sent'] = True
-    except Exception:
+    except smtplib.SMTPException:
         context['error'] = ('An error occurred during confirmation . '
                             'Please try again later.')
         context['admins'] = conf_settings.ADMINS
diff --git a/patchwork/views/patch.py b/patchwork/views/patch.py
index 41a2ec8..e477572 100644
--- a/patchwork/views/patch.py
+++ b/patchwork/views/patch.py
@@ -77,15 +77,15 @@ def patch(request, patch_id):
         elif action == 'addtobundle':
             bundle = get_object_or_404(
                 Bundle, id=request.POST.get('bundle_id'))
-            try:
-                bundle.append_patch(patch)
-                bundle.save()
+            if bundle.append_patch(patch)
                 messages.success(request,
-                                 'Patch added to bundle "%s"' % bundle.name)
-            except Exception as ex:
+                                 'Patch "%s" added to bundle "%s"' % (
+                                     patch.name, bundle.name))
+            else:
                 messages.error(request,
-                               "Couldn't add patch '%s' to bundle %s: %s"
-                               % (patch.name, bundle.name, ex.message))
+                               'Failed to add patch "%s" to bundle "%s": '
+                               'patch is already in bundle' % (
+                                   patch.name, bundle.name))
 
         # all other actions require edit privs
         elif not editable:
diff --git a/patchwork/views/user.py b/patchwork/views/user.py
index dfbfde8..b82636f 100644
--- a/patchwork/views/user.py
+++ b/patchwork/views/user.py
@@ -17,7 +17,7 @@
 # along with Patchwork; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-from __future__ import absolute_import
+import smtplib
 
 from django.contrib import auth
 from django.contrib.auth.decorators import login_required
@@ -145,7 +145,7 @@ def link(request):
                                            context, request=request),
                           settings.DEFAULT_FROM_EMAIL,
                           [form.cleaned_data['email']])
-            except Exception:
+            except smtplib.SMTPException:
                 context['confirmation'] = None
                 context['error'] = ('An error occurred during confirmation. '
                                     'Please try again later')
diff --git a/patchwork/views/xmlrpc.py b/patchwork/views/xmlrpc.py
index ea2a1e3..793e82a 100644
--- a/patchwork/views/xmlrpc.py
+++ b/patchwork/views/xmlrpc.py
@@ -94,7 +94,7 @@ class PatchworkXMLRPCDispatcher(SimpleXMLRPCDispatcher,
         try:
             decoded = base64.b64decode(header.encode('ascii')).decode('ascii')
             username, password = decoded.split(':', 1)
-        except:
+        except ValueError:
             raise Exception('Invalid authentication credentials')
 
         return authenticate(username=username, password=password)
@@ -124,7 +124,7 @@ class PatchworkXMLRPCDispatcher(SimpleXMLRPCDispatcher,
             response = self.dumps(response, methodresponse=1)
         except six.moves.xmlrpc_client.Fault as fault:
             response = self.dumps(fault)
-        except:
+        except Exception:  # noqa
             # report exception back to server
             response = self.dumps(
                 six.moves.xmlrpc_client.Fault(
@@ -149,7 +149,7 @@ def xmlrpc(request):
     if request.method == 'POST':
         try:
             ret = dispatcher._marshaled_dispatch(request)
-        except Exception:
+        except Exception:  # noqa
             return HttpResponseServerError()
     else:
         ret = dispatcher.generate_html_documentation()
-- 
2.7.4



More information about the Patchwork mailing list