Как повысить количество исключений в рубине

вам не нужно вытягивать атрибут «картинка». есть намного более удобный способ, единственное, что вам нужно - это userid, см. пример ниже;

https://graph.facebook.com/user_id/picture?type=large

стр. s. тип определяет размер, который вы хотите

plz, помните, что используя токен с базовыми разрешениями, / me / friends вернут список друзей только с атрибутами id + name

2
задан ndn 13 July 2018 в 08:20
поделиться

3 ответа

Исключения не должны использоваться для проверки. В основном вы не должны проходить стек для проверки в целом.

Что вы в основном делаете:

X - это верхний уровень и может обрабатывать все. X вызывает Y. Y вызывает Z. Z выполняет проверки и делает что-то после этого, создавая исключение, если проверка не удалась.

Что вы должны делать:

X вызывает Y. Y вызывает V и X. V выполняет проверки и возвращает результат на основании того, была ли вещь действительной. Y не может вызвать X, если V сказал, что вещь недействительна. Y распространяет недействительность или успешный результат на X. X делает то, что он сделал бы с if / else в отношении действительности, а не rescue.


Но скажем, вы действительно хочу это сделать. Вместо этого вы должны использовать throw / catch:

def validate_date(date)
  errors = []

  errors << 'Improper format' unless date.match?(/^\d{2}-\d{2}-\d{4}$/)
  errors << 'Invalid day' unless date.match?(/^[0-3]\d/)
  errors << 'Invalid month' unless date.match?(/-[12]\d-/)
  errors << 'Invalid year' unless date.match?(/[12][90]\d{2}$/)

  throw(:validation, errors) unless errors.empty?
end

def invoke_validation_and_do_stuff(date)
  validate_date(date)
  puts "I won't be called unless validation is successful for #{date}"
end

def meaningless_nesting(date)
  invoke_validation_and_do_stuff(date)
end

def more_meaningless_nesting(date)
  meaningless_nesting(date)
end

def top_level(date)
  validation_errors = catch(:validation) do
    more_meaningless_nesting(date)
    nil
  end

  if validation_errors
    puts validation_errors
  else
    puts 'Execution successful without errors'
  end
end


top_level '20-10-2012'
  # I won't be called unless validation is successful for 20-10-2012
  # Execution successful without errors

top_level '55-50-2012'
  # Invalid day
  # Invalid month
5
ответ дан ndn 17 August 2018 в 13:31
поделиться
  • 1
    Спасибо за разъяснение, но что произойдет, если я захочу повторить попытку, исправляя ошибки – anquegi 13 July 2018 в 08:02
  • 2
    @anquegi в top_level вы можете посмотреть, есть ли validation_errors ошибка, которую вы знаете как «исправить». Если это так, выполните некоторые действия, которые выполняют «fix». Затем снова вызовите top_level (иначе рекурсия). – ndn 13 July 2018 в 08:05
  • 3
    спасибо за последнее разъяснение, это действительно хороший ответ – anquegi 13 July 2018 в 08:14
  • 4
    @anquegi рад, что это было полезно. – ndn 13 July 2018 в 08:18

Такой концепции не существует на любом языке, о котором я знаю. Вы можете поднять одно исключение последовательно, но не поднимать несколько исключений за один раз, и даже при работе над несколькими потоками для повышения «одновременно» все еще исключение возникает в разных потоках управления.

Когда возникает исключение, поток управления переходит к этому исключению. У вас есть два варианта: сделать что-нибудь об этом или сбой. Третий вариант отсутствует, и отдельный поток управления не появился и продолжается до тех пор, пока это исключение не будет рассмотрено соответствующим образом.

Если вы хотите увидеть несколько сбоев, как указано в комментарии, тогда вы все равно делайте это по одному, как и они будут подняты. Исключение возникает, вы проверяете, регистрируетесь, делаете что угодно, подавляете его и видите следующее, если кто-то поднимается на что-то еще.

Если вы спрашиваете, как можно увеличить несколько необработанных исключений, тогда это действительно не имеет смысла. Сложно спросить, как быть в двух местах одновременно.

1
ответ дан ForeverZer0 17 August 2018 в 13:31
поделиться

Я не думаю, что вы можете сделать несколько исключений, он поднимет первое исключение, которое он найдет, и будет пойман самым внутренним оператором спасения, если несколько существуют или зависят от типа исключения, которое вы поднимаете, и типа спасения

1
ответ дан Subash 17 August 2018 в 13:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: