apps/usb_probe.py: handle libusb1 exceptions

Some USB device properties are only accessible if the user has the
appropriate permissions. Handle libusb1 errors to graciously skip
showing details for these devices.
diff --git a/apps/usb_probe.py b/apps/usb_probe.py
index 065fa79..a973c22 100644
--- a/apps/usb_probe.py
+++ b/apps/usb_probe.py
@@ -185,37 +185,43 @@
             if device_is_bluetooth_hci:
                 bumble_transport_names.append(f'usb:{bluetooth_device_count - 1}')
 
-            serial_number_collision = False
-            if device_id in devices:
-                for device_serial in devices[device_id]:
-                    if device_serial == device.getSerialNumber():
-                        serial_number_collision = True
-
-            if device_id not in devices:
-                bumble_transport_names.append(basic_transport_name)
-            else:
-                bumble_transport_names.append(f'{basic_transport_name}#{len(devices[device_id])}')
-
-            if device.getSerialNumber() and not serial_number_collision:
-                bumble_transport_names.append(f'{basic_transport_name}/{device.getSerialNumber()}')
 
             print(color(f'ID {device.getVendorID():04X}:{device.getProductID():04X}', fg=fg_color, bg=bg_color))
-            if bumble_transport_names:
-                print(color('  Bumble Transport Names:', 'blue'), ' or '.join(color(x, 'cyan' if device_is_bluetooth_hci else 'red') for x in bumble_transport_names))
             print(color('  Bus/Device:            ', 'green'), f'{device.getBusNumber():03}/{device.getDeviceAddress():03}')
-            if device.getSerialNumber():
-                print(color('  Serial:                ', 'green'), device.getSerialNumber())
             print(color('  Class:                 ', 'green'), device_class_string)
             print(color('  Subclass/Protocol:     ', 'green'), device_subclass_string)
-            print(color('  Manufacturer:          ', 'green'), device.getManufacturer())
-            print(color('  Product:               ', 'green'), device.getProduct())
 
-            if verbose:
-                show_device_details(device)
+            try:
+                serial_number_collision = False
+                if device_id in devices:
+                    for device_serial in devices[device_id]:
+                        if device_serial == device.getSerialNumber():
+                            serial_number_collision = True
 
-            print()
+                if device_id not in devices:
+                    bumble_transport_names.append(basic_transport_name)
+                else:
+                    bumble_transport_names.append(f'{basic_transport_name}#{len(devices[device_id])}')
 
-            devices.setdefault(device_id, []).append(device.getSerialNumber())
+                if device.getSerialNumber() and not serial_number_collision:
+                    bumble_transport_names.append(f'{basic_transport_name}/{device.getSerialNumber()}')
+
+                if bumble_transport_names:
+                    print(color('  Bumble Transport Names:', 'blue'), ' or '.join(color(x, 'cyan' if device_is_bluetooth_hci else 'red') for x in bumble_transport_names))
+                if device.getSerialNumber():
+                    print(color('  Serial:                ', 'green'), device.getSerialNumber())
+                print(color('  Manufacturer:          ', 'green'), device.getManufacturer())
+                print(color('  Product:               ', 'green'), device.getProduct())
+
+                if verbose:
+                    show_device_details(device)
+
+                print()
+
+                devices.setdefault(device_id, []).append(device.getSerialNumber())
+
+            except usb1.USBError as e:
+                print(color(f'  {e}', 'red'))
 
 
 # -----------------------------------------------------------------------------