2010-09-29 20 views
1

я получаю следующее тзд дамп:обработка исключений

Terminate вызывается после метания экземпляра «станд :: out_of_range» , что(): basic_string :: зиЬзЬг Прервать - ядро ​​сбрасывали

Я чтение 14-значного шестнадцатеричного числа из большого файла. .? Периодически я замечаю, что эти пустые строки (ну я не уверен, что это такое Как обработать это исключение, может быть, попытка поймать штуковина Это выглядит, как показано ниже:

123456789ABCDE 
123456789ABCDE 
123456789ABCDE 

123456789ABCDE 

Я не уверен, что скрытый символ занимает пространство, но вызывает проблемы, и я не уверен, как справиться с этими идеями. Может быть, я мог бы получить образец того, как его обрабатывать?

+3

Опубликовать больше кода; Я подозреваю, что вы где-то пропускаете границу, но я не могу быть уверен. В любом случае вы должны проверить данные перед их обработкой, а не перехватывать исключения, вызванные недействительными данными. – You

ответ

1

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

+0

+1 для солидного комментария.Я думаю, что ключевым моментом здесь является то, что в идеале вы бы сделали небольшую общую проверку входных строк - если производительность не является критичной для однострочного регулярного выражения, а не просто надеется, что что-то вы делаете в коде с оптимизацией ввода-вывода случается для вас исключение (плакат спросил об этом варианте). Слишком просто, чтобы результат был ошибочным на уровне бизнес-логики, если отдельные операции обработки данных были неправильными для такого уровня индексирования и обработки данных немой. –

1

Robustness principle (также известный как закон Постеля):

Будьте консервативны в том, что вы пришлите; быть либеральным в том, что вы принимаете.

Таким образом, одна из возможностей - просто проигнорировать/пропустить неверные строки.

+1

Переход от «быть либеральным в том, что вы принимаете», чтобы «игнорировать/пропускать неверные строки» является сомнительным рецептом надежности. Вы хотите быть либеральным в _considering_ возможном вводе, поэтому вы можете подтвердить, что у вас есть законный ввод. Итак, согласитесь с тем, чтобы справиться с этим, но не стесняйтесь отклонять его на уровне бизнес-логики, который в этом случае правильно заставляет проверять, как был создан этот файл. В противном случае вы вполне можете маскировать ошибку вверх по течению, которая вернется, чтобы преследовать вас или подорвать ваши результаты в любом случае. Что делать, если значение отсутствует, а не лишняя новая строка является поддельной? –

3

Вам нужно отправить больше кода, но из-за исключения, похоже, что вы читаете файл строки за строкой и сохраняете строку в std::string, а затем вызываете std::string::substr(), чтобы извлечь 14 символов, которые вы хотите.

Предположим, что ваш код выглядит следующим образом:

std::string str;   /* the lines are stored in this string */ 
std::string substring; /* extracted substring stored here */ 

/* Read file line by line */ 
// ... 

substring = str.substr(index, 14); //extract 14 characters starting at 'index' 

Изменить это:

if(str.size() > index) { 
    substring = str.substr(index, 14); 
} 
+0

'substr' спокойно скопирует возвращенный диапазон, если он простирается до конца. Проверка достаточно только для 'index <= str.size()'. +1. – Potatoswatter

+0

@Potatoswatter, хорошая точка, спасибо, я обновлю ответ – Praetorian

1

Другие дали конкретный ответ на этот вопрос, специфические.

Но, в общем, запустите это в отладчике и посмотрите, куда он кидается. Для gdb do 'catch throw' gdb затем разрывается в точке, где происходит ошибка. Будет довольно очевидно, в чем причина.

0

Следующий код, вероятно, показывает возможный вопрос:

#include <iostream> 

int main(){ 
    std::string s = "Hi"; 

    std::string sb = s.substr(14, 0); // extract 0 characters from 
             // an out-of-range 
             // start location 
} 

basic_string<charT,traits,Allocator> 
substr(size_type pos = 0, size_type n = npos) const; 

Если индекс начало (первый аргумент) недействителен (больше, чем размер объекта строки), стандартные мандаты способ бросить «out_of_range ' ошибка.

Также похоже, что у вас нет операций с цепочкой с try/catch. Это не очень хорошая практика. Имейте все код, который может генерировать исключения в блоке catch try. Это дает вам возможность обработать исключение (если хотите).

Смежные вопросы