Я работаю над разбиением исходного файла на токены, в частности, для проверки идентификаторов. Тем не менее, существует требование, чтобы идентификаторы были длиной до 30 символов. Когда идентификатор достигает этой длины, я вызываю исключение с сообщением: 'Identifiers can only be 30 characters long, truncating..'
.Сохранять переменную после исключения.
Так оно и должно быть, но когда я поднимаю это исключение, я выхожу из своего метода, который сканирует идентификаторы, прежде чем я смогу его сохранить. Мне нужно как-то поднять исключение и сохранить идентификатор, который я собрал до сих пор. Любые идеи относительно того, как это можно сделать?
# classify each character, and call approriate scan methods
def tokenize()
@infile.each_char do |c|
begin
case c
when /[a-zA-Z\$]/
scan_identifier(c)
when /\s/
#ignore spaces
else
#do nothing
end
rescue TokenizerError => te
puts "#{te.class}: #{te.message}"
end
end
end
# Reads an identifier from the source program
def scan_identifier(id)
this_id = id #initialize this identifier with the character read above
@infile.each_char do |c|
if c =~ /[a-zA-Z0-9_]/
this_id += c
# raising this exception leaves this function before collecting the
# truncated identifier
raise TokenizerError, 'Identifiers can only be 30 characters long, truncating..' if this_id.length == 30
else
puts "#{this_id}"
break # not part of the identifier, or an error
end
end
end
Исключения должны использоваться только в «исключительных» случаях. Не пытайтесь создать поток программ с ними. Просто верните токен из своего метода. –
Это не предназначалось для проблемы с потоком программ. Я должен поднять предупреждение тем, кто использует программу, что их идентификатор слишком длинный, и он усекается. Я решил, что исключение будет логичным способом сделать это. Что было бы хорошей альтернативой? –
Позвольте мне превратить это в ответ. –