URI: 
       tcontact/invoice import: better exception handling. - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 909c063eb1922d0a7e4b61d5538cb5b34edbf1e7
   DIR parent 7f04c305676df739b8ba00137df22011f9477488
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Wed, 14 Feb 2018 19:42:35 +0100
       
       contact/invoice import: better exception handling.
       
       see #3904
       
       Diffstat:
         M gui/qt/contact_list.py              |       7 +++++--
         M gui/qt/invoice_list.py              |       7 +++++--
         M lib/contacts.py                     |      11 +++++++++--
         M lib/paymentrequest.py               |       8 ++++++--
         M lib/util.py                         |      13 +++++++++++++
       
       5 files changed, 38 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/gui/qt/contact_list.py b/gui/qt/contact_list.py
       t@@ -26,7 +26,7 @@ import webbrowser
        
        from electrum.i18n import _
        from electrum.bitcoin import is_address
       -from electrum.util import block_explorer_URL
       +from electrum.util import block_explorer_URL, FileImportFailed
        from electrum.plugins import run_hook
        from PyQt5.QtGui import *
        from PyQt5.QtCore import *
       t@@ -57,7 +57,10 @@ class ContactList(MyTreeWidget):
                filename, __ = QFileDialog.getOpenFileName(self.parent, "Select your wallet file", wallet_folder)
                if not filename:
                    return
       -        self.parent.contacts.import_file(filename)
       +        try:
       +            self.parent.contacts.import_file(filename)
       +        except FileImportFailed as e:
       +            self.parent.show_message(str(e))
                self.on_update()
        
            def create_menu(self, position):
   DIR diff --git a/gui/qt/invoice_list.py b/gui/qt/invoice_list.py
       t@@ -25,7 +25,7 @@
        
        from .util import *
        from electrum.i18n import _
       -from electrum.util import format_time
       +from electrum.util import format_time, FileImportFailed
        
        
        class InvoiceList(MyTreeWidget):
       t@@ -61,7 +61,10 @@ class InvoiceList(MyTreeWidget):
                filename, __ = QFileDialog.getOpenFileName(self.parent, "Select your wallet file", wallet_folder)
                if not filename:
                    return
       -        self.parent.invoices.import_file(filename)
       +        try:
       +            self.parent.invoices.import_file(filename)
       +        except FileImportFailed as e:
       +            self.parent.show_message(str(e))
                self.on_update()
        
            def create_menu(self, position):
   DIR diff --git a/lib/contacts.py b/lib/contacts.py
       t@@ -23,9 +23,12 @@
        import re
        import dns
        import json
       +import traceback
       +import sys
        
        from . import bitcoin
        from . import dnssec
       +from .util import FileImportFailed, FileImportFailedEncrypted
        
        
        class Contacts(dict):
       t@@ -51,8 +54,12 @@ class Contacts(dict):
                try:
                    with open(path, 'r') as f:
                        d = self._validate(json.loads(f.read()))
       -        except:
       -            return
       +        except json.decoder.JSONDecodeError:
       +            traceback.print_exc(file=sys.stderr)
       +            raise FileImportFailedEncrypted()
       +        except BaseException:
       +            traceback.print_exc(file=sys.stdout)
       +            raise FileImportFailed()
                self.update(d)
                self.save()
        
   DIR diff --git a/lib/paymentrequest.py b/lib/paymentrequest.py
       t@@ -40,6 +40,7 @@ except ImportError:
        from . import bitcoin
        from . import util
        from .util import print_error, bh2u, bfh
       +from .util import FileImportFailed, FileImportFailedEncrypted
        from . import transaction
        from . import x509
        from . import rsakey
       t@@ -471,9 +472,12 @@ class InvoiceStore(object):
                    with open(path, 'r') as f:
                        d = json.loads(f.read())
                        self.load(d)
       -        except:
       +        except json.decoder.JSONDecodeError:
                    traceback.print_exc(file=sys.stderr)
       -            return
       +            raise FileImportFailedEncrypted()
       +        except BaseException:
       +            traceback.print_exc(file=sys.stdout)
       +            raise FileImportFailed()
                self.save()
        
            def save(self):
   DIR diff --git a/lib/util.py b/lib/util.py
       t@@ -58,6 +58,19 @@ class InvalidPassword(Exception):
            def __str__(self):
                return _("Incorrect password")
        
       +
       +class FileImportFailed(Exception):
       +    def __str__(self):
       +        return _("Failed to import file.")
       +
       +
       +class FileImportFailedEncrypted(FileImportFailed):
       +    def __str__(self):
       +        return (_('Failed to import file.') + ' ' +
       +                _('Perhaps it is encrypted...') + '\n' +
       +                _('Importing encrypted files is not supported.'))
       +
       +
        # Throw this exception to unwind the stack like when an error occurs.
        # However unlike other exceptions the user won't be informed.
        class UserCancelled(Exception):