ОШИБКА :

Логическая ошибка в программировании может быть ошибкой в ​​программе, из-за которой она работает неправильно, но не аварийно завершается (или аварийно завершается). … программа, в отличие от программной ошибки, программа с логической ошибкой может быть действительной программой в языке, хотя она ведет себя не так, как предполагалось. Преодоление ошибок из-за плохого кода в некоторых программах связано с получением ошибочного результата.

ТИПЫ ОШИБОК:

Есть в основном три типа ошибок, с которыми вы просто должны иметь дело при написании программ:

  • Синтаксические ошибки — синтаксические ошибки представляют собой грамматические ошибки при использовании языка программирования.
  • Ошибки выполнения. Ошибки выполнения возникают, когда программа без синтаксических ошибок просит компьютер попытаться сделать что-то, что компьютер не может надежно сделать.
  • Логические ошибки. Логические ошибки возникают, когда в вашей программе есть конструктивный недостаток.

УМНЫЙ КОМПИЛЯТОР:

В Rust — Компилятор выполняет самую важную работу по устранению ошибок в программах на Rust. Он анализирует код во время компиляции и выдает предупреждения, если код не соответствует правилам управления памятью или аннотациям времени жизни правильно.

Компилятор Rust анализирует не только проблемы, связанные с временем жизни или управлением памятью, но и распространенные ошибки кодирования.

Стремление Rust к надежности распространяется и на обработку ошибок. Ошибки — это неотъемлемая часть программного обеспечения, поэтому в Rust есть ряд функций для обработки ситуаций, когда что-то идет не так. Rust во многих случаях требует признать вероятность ошибки и предпринять какие-то действия, прежде чем код будет скомпилирован. Это делает нашу программу более надежной, гарантируя, что мы обнаружим ошибки и обработаем их надлежащим образом, прежде чем вы развернете свой код в рабочей среде!

ОБЪЯСНИТЕ КОД ОШИБКИ:

Сообщения об ошибках очень описательные, и мы можем легко увидеть, где ошибка. Но хотя мы не будем определять сложность с помощью сообщения об ошибке, команды rustc –explain помогают нам определить тип ошибки и способ ее устранения, показывая простые примеры кода, которые выражают эквивалентную проблему и, следовательно, решение, которое мы должны использовать. .

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

ПАНИКА:

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

Кроме того, когда мы не используем многофункциональный отладчик или надлежащие журналы, иногда мы хотели бы отладить код, выйдя из программы из выбранной строки кода, распечатав выбранное сообщение или значение привязки переменной, чтобы узнать текущий поток программы.
В вышеуказанных случаях мы будем использовать panic! макрос.

ПАНИКА! МАКРО:

Rust has the panic! macro. When the panic! the macro executes, our program will print a failure message, unwind and pack up the stack, then quit. This most ordinarily occurs when a bug of some kind has been detected and it’s not clear to the programmer the way to handle the error.
Quit From a selected Line.
fn main() {
// some code
// if we'd like to debug in here
panic!();
}

// — — — — — Ошибка времени компиляции — — — — –
Поток «main» запаниковал при «явной панике», src/main.rs:5:5

Призыв к панике! вызывает сообщение об ошибке, содержащееся в последних двух строках. основная строка показывает наше сообщение о панике и, следовательно, место в нашем текстовом файле ASCII, где произошла паника: src/main.rs:2:5 указывает, что это вторая строка, пятый символ нашего файла src/main.rs.

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

02. Выйдите с пользовательским сообщением об ошибке.

#[allow(unused_mut)] //A lint attribute wont to suppress the warning; username variable doesn't get to be mutable
fn main() {
let mut username = String::new();
// some code to urge the name
if username.is_empty() {
panic!("Username is empty!");
}
println!("{}", username);
}

// — — — — — Ошибка времени компиляции — — — — —

Поток main запаниковал из-за сообщения «Имя пользователя пусто!», src/main.rs:8:9

ИСПОЛЬЗУЯ ПАНИКУ! ОБРАТНАЯ ТРАССА:

Let’s check out another example to ascertain what it’s like when a panic! the decision comes from a library due to a bug in our code rather than from our code calling the macro directly. Listing 9-1 has some code that attempts to access a component by index during a vector.
fn main() {
let v = vec![1, 2, 3];
v[99];
}
Here, we’re attempting to access the 100th element of our vector (which is at index 99 because indexing starts at zero), but it's only 3 elements. during this situation, Rust will panic. Using [ ] is meant to return a component, but if you pass an invalid index, there’s no element that Rust could return here that might be correct.

ОБРАТНАЯ ТРАССА:

Чтобы защитить вашу программу от этого типа уязвимости, если вы пытаетесь прочитать компонент по несуществующему индексу, Rust остановит выполнение и откажется продолжать. Давайте посмотрим на это, попробовав:

$ cargo run
Компиляция panic v0.1.0 (file:///projects/panic)
Завершена разработка [неоптимизированных + отладочная информация] целей за 0,27 с
Запуск `target /debug/panic`
поток 'main' запаниковал при 'index out of bounds: len равен 3, но index равен 99', libcore/slice/mod.rs:2448:10
Примечание. Выполнить с `RUST_BACKTRACE=1` для обратной трассировки.

Эта ошибка указывает на файл, который мы не писали, libcore/slice/mod.rs. Это реализация slice в текстовом файле Rust ASCII. Код, который запускается после того, как мы используем [] для нашего вектора v, находится в libcore/slice/mod.rs, вот где паника! действительно происходит.

Следующая строка примечания говорит нам, что мы установим переменную среды RUST_BACKTRACE, чтобы запрашивать обратную трассировку того, что именно произошло, чтобы вызвать ошибку. Следом может быть список всех функций, вызываемых для перехода к текущей точке. Обратные трассировки в Rust работают так же, как и в других языках: ключ к чтению обратных трассировок — начать с самого высокого и пролистывать до тех пор, пока не увидите файлы, которые вы написали. Это место, где зародилась материя. Строки над строками, в которых упоминаются наши файлы, — это код, который вызывается нашим кодом; строки ниже - это код, который называется нашим кодом. Эти строки могут включать основной код Rust, код стандартной библиотеки или ящики, которые вы используете. Давайте попробуем получить обратную трассировку, установив для переменной среды RUST_BACKTRACE любое значение, кроме 0. В листинге 9-2 показан вывод почти такой же, как вы увидите.

ИСПРАВЛЯЕМЫЕ ОШИБКИ С РЕЗУЛЬТАТАМИ:

Большинство ошибок недостаточно серьезны, чтобы программа полностью их предотвращала. Иногда, когда функция дает сбой, это происходит по причине, которую вы просто можете легко интерпретировать и ответить. например, если вы пытаетесь открыть файл, в котором операция завершается сбоем из-за того, что файл не существует, вы, возможно, захотите создать файл, а не прерывать метод. Result Type», что перечисление Result определено как имеющее два варианта, Ok и Err, следующим образом:

#![allow(unused_variables)]
fn main() {
enum Result {
Ok(T),
Err(E),
}
}

T и E являются параметрами обобщенного типа: мы обсудим обобщения более подробно в главе (общие типы данных). Что вы хотели бы сразу понять, так это то, что T представляет собой ценность, которая будет возвращена в случае успеха в варианте Ok, а E представляет вид ошибки, которая будет возвращена в случае неудачи в варианте Err. Поскольку Result имеет эти общие параметры типа, мы будем использовать тип Result и, следовательно, функции, определенные в нем библиотекой качества, во многих различных ситуациях, когда успешное значение и значение ошибки, которые мы хотели бы вернуть, могут отличаться.

Откуда мы знаем, что File::open возвращает результат?

Давай попробуем! все мы знаем, что возвращаемый тип File::open не имеет типа u32, поэтому давайте изменим оператор let f на это:
let f: u32 = File::open(“hello.txt ”);

Это говорит нам о том, что сортировка возвращаемого значения функции File::open может быть результатом. Общий параметр T был заполнен здесь значением успеха, std::fs::File, которое может быть дескриптором файла. вид E, используемый в значении ошибки, — это std::io::Error.
Этот тип возврата означает, что решение File::open может быть успешным и вернуть дескриптор файла, из которого мы будем читать или записывать. Вызов также может завершиться ошибкой: например, файл не будет существовать или у нас не будет доступа к файлу. Функция File::open должна сообщать нам об успешном или неудачном выполнении, и в то же время предоставлять либо дескриптор файла, либо информацию об ошибке. Эта информация строго соответствует перечислению Result.

Использование выражения соответствия для обработки вариантов результата, которые могут быть возвращены

use std::fs::File;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
Err(error) => {
panic!("There was a drag opening the file: {:?}", error)
},
};
}

Обратите внимание, что, как и перечисление Option, перечисление Result и его варианты входят в область прелюдии, поэтому мы не можем указать Result:: перед вариантами Ok и Err в ответвлениях. Здесь мы сообщаем Rust, что когда результат будет «ОК», верните значение внутреннего файла из варианта «ОК», а затем мы присвоим это значение дескриптора файла переменной f. После совпадения мы будем использовать дескриптор файла для чтения или записи.

Выход из паники! макрос:

Поток 'main' запаниковал при открытии файла: Error {repr:
Os { code: 2, message: «Нет такого файла или каталога» } }', src/main.rs:9: 12

Для получения более подробной информации посетите: https://www.technologiesinindustry4.com/2020/12/what-are-the-ways-to-handle-errors-in-rust.html