От эти запись страницы urlopen
документов, похоже, что просто необходимо поймать URLError. Если Вы действительно хотите застраховать свои ставки против проблем в коде urllib, можно также поймать Exception
как нейтрализация. Сделайте не всего except:
, так как это поймает SystemExit
и KeyboardInterrupt
также.
Редактирование: То, что я означаю говорить, Вы фиксируете ошибки, которые это, как предполагается, бросает. Если это бросает что-то еще, это происходит, вероятно, из-за кода urllib, не ловя что-то, что это должно было поймать и обернуть в URLError
. Даже stdlib имеет тенденцию пропускать простые вещи как AttributeError
. Ловля Exception
, поскольку нейтрализация (и вход, что это поймало) помогут Вам выяснить то, что происходит, не захватывая SystemExit
и KeyboardInterrupt
.
Укороченная версия (также сдвиг 8 бит вместо 4):
static short ToShort(short byte1, short byte2)
{
return (byte2 << 8) + byte1;
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
byte2 = (byte)(number >> 8);
byte1 = (byte)(number & 255);
}
Используйте BitConverter
short number = 42;
byte[] numberBytes = BitConverter.GetBytes(number);
short converted = BitConverter.ToInt16(numberBytes);
Если вы хотите взять байты ... возьмите байты; и ваши смены отключены, и |
будет более интуитивно понятным:
static short ToShort(byte byte1, byte byte2)
{ // using Int32 because that is what all the operations return anyway...
return (short)((((int)byte1) << 8) | (int)byte2);
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
byte1 = (byte)(number >> 8); // to treat as same byte 1 from above
byte2 = (byte)number;
}
Байт - это 8 бит, а не 4, поэтому сдвиг отключен. Вы также объявили локальные переменные во второй функции, чтобы не писать параметры out
, как вы намеревались. Также будет понятнее / лучше, если вы ограничитесь побитовыми операциями ( &
, |
и ~
), где это возможно.
static short ToShort(byte byte1, byte byte2)
{
return (short) ((byte2 << 8) | (byte1 << 0));
}
static void FromShort(short number, out byte byte1, out byte byte2)
{
byte2 = (byte) (number >> 8);
byte1 = (byte) (number >> 0);
}
Обратите внимание, что слева и справа сдвиги на ноль, строго говоря, не нужны. Я просто добавил их для симметрии. Кроме того, лично я бы порекомендовал вам просто изучить холодную побитовую арифметику и не писать подобные вспомогательные функции. Не надо скрывать детали чем-то столь фундаментальным, ИМХО.