URI: 
       tlnpeer: some exception handling clean up - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 7e8be3d2e7e178cc6534520c07d0af413896f2bf
   DIR parent efc8948c006c50d8edf2dd84d23fff61234b0372
  HTML Author: SomberNight <somber.night@protonmail.com>
       Date:   Thu, 13 Jun 2019 19:06:47 +0200
       
       lnpeer: some exception handling clean up
       
       main_loop should dump traces of unexpected exceptions to log.
       Coroutines/functions invoked inside main_loop should simply propagate it
       up the chain.
       Typical exceptions are handled in handle_disconnect without dumping the trace.
       
       Diffstat:
         M electrum/lnpeer.py                  |      27 +++++++++++++++++----------
       
       1 file changed, 17 insertions(+), 10 deletions(-)
       ---
   DIR diff --git a/electrum/lnpeer.py b/electrum/lnpeer.py
       t@@ -43,6 +43,7 @@ from .lnutil import (Outpoint, LocalConfig, RECEIVED, UpdateAddHtlc,
        from .lntransport import LNTransport, LNTransportBase
        from .lnmsg import encode_msg, decode_msg
        from .lnverifier import verify_sig_for_channel_update
       +from .interface import GracefulDisconnect
        
        if TYPE_CHECKING:
            from .lnworker import LNWorker
       t@@ -172,8 +173,8 @@ class Peer(Logger):
                    if flag not in their_flags and get_ln_flag_pair_of_bit(flag) not in their_flags:
                        # they don't have this feature we wanted :(
                        if flag % 2 == 0:  # even flags are compulsory
       -                    raise LightningPeerConnectionClosed("remote does not have even flag {}"
       -                                                        .format(str(LnLocalFeatures(1 << flag))))
       +                    raise GracefulDisconnect("remote does not have even flag {}"
       +                                             .format(str(LnLocalFeatures(1 << flag))))
                        self.localfeatures ^= 1 << flag  # disable flag
                if isinstance(self.transport, LNTransport):
                    self.channel_db.add_recent_peer(self.transport.peer_addr)
       t@@ -200,13 +201,16 @@ class Peer(Logger):
                async def wrapper_func(self, *args, **kwargs):
                    try:
                        return await func(self, *args, **kwargs)
       -            except Exception as e:
       -                self.logger.info("Disconnecting: {}".format(repr(e)))
       +            except GracefulDisconnect as e:
       +                self.logger.log(e.log_level, f"Disconnecting: {repr(e)}")
       +            except LightningPeerConnectionClosed as e:
       +                self.logger.info(f"Disconnecting: {repr(e)}")
                    finally:
                        self.close_and_cleanup()
                return wrapper_func
        
            @ignore_exceptions  # do not kill main_taskgroup
       +    @log_exceptions
            @handle_disconnect
            async def main_loop(self):
                async with aiorpcx.TaskGroup() as group:
       t@@ -214,7 +218,6 @@ class Peer(Logger):
                    await group.spawn(self.query_gossip())
                    await group.spawn(self.process_gossip())
        
       -    @log_exceptions
            async def process_gossip(self):
                # verify in peer's TaskGroup so that we fail the connection
                while True:
       t@@ -283,11 +286,16 @@ class Peer(Logger):
                    if not verify_sig_for_channel_update(payload, payload['start_node']):
                        raise BaseException('verify error')
        
       -    @log_exceptions
            async def query_gossip(self):
       -        await asyncio.wait_for(self.initialized.wait(), 10)
       +        try:
       +            await asyncio.wait_for(self.initialized.wait(), 10)
       +        except asyncio.TimeoutError as e:
       +            raise GracefulDisconnect("initialize timed out") from e
                if self.lnworker == self.lnworker.network.lngossip:
       -            ids, complete = await asyncio.wait_for(self.get_channel_range(), 10)
       +            try:
       +                ids, complete = await asyncio.wait_for(self.get_channel_range(), 10)
       +            except asyncio.TimeoutError as e:
       +                raise GracefulDisconnect("query_channel_range timed out") from e
                    self.logger.info('Received {} channel ids. (complete: {})'.format(len(ids), complete))
                    self.lnworker.add_new_ids(ids)
                    while True:
       t@@ -400,8 +408,7 @@ class Peer(Logger):
                try:
                    await asyncio.wait_for(self.initialize(), 10)
                except (OSError, asyncio.TimeoutError, HandshakeFailed) as e:
       -            self.logger.info('initialize failed, disconnecting: {}'.format(repr(e)))
       -            return
       +            raise GracefulDisconnect(f'initialize failed: {repr(e)}') from e
                async for msg in self.transport.read_messages():
                    self.process_message(msg)
                    await asyncio.sleep(.01)