Рубрики
Без рубрики

Сравнение обработки ошибок в Java, Go и Rust.

Кто из них делает это лучше всего? Давайте сравним их и посмотрим!. Помеченный как java, go, rust.

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

Давайте посмотрим, как Java это делает. Сначала мы рассмотрим Java 6-.

BufferedReader reader;
try {
    reader = new BufferedReader(new FileInputStream("test.txt"));
    // read file
    if (condition) {
        // closed by finally block
        return;
    }

    // closed by finally block
} catch(Exception e) {
    // do proper error handling
    // closed by finally block
} finally {
    try {
        reader.close();
    } catch(Exception e) {
        // do proper error handling
    }
}

System.out.println("File read");

О боже мой. Хорошо, это УЖАСНО. Давайте посмотрим, как работает Java 7+.

try(BufferedReader reader = new BufferedReader(new FileInputStream("test.txt"))) {
    // read file
    if (condition) {
        // automatically closed
        return;
    }

    // automatically closed
} catch(Exception e) {
    // do proper error handling
    // automatically closed
}

System.out.println("File read")

То есть… отлично. Поздравляю, Ява. Давайте посмотрим, как Go это делает.

file, err := os.Open("test.txt") // no semicolon :(
                                 // i love semicolons :(
if err != nil {
    // do proper error handling
}
defer file.Close()
// read file
if condition {
    // closed by defer
    return
}

fmt.Println("File read")
// File closed on return, so you probably wanna return ASAP

Одна вещь, которую следует отметить в Go: независимая обработка ошибок. Вы не можете справиться со всеми ошибками, собранными вместе. Это ХОРОШО. Это позволит вам указать, где именно все пошло не так. Ошибки в Go также в значительной степени являются строками. Вы делаете пользовательскую ошибку с ошибками. Новый (“о нет”). Хороший материал, а теперь давайте взглянем на Rust.

{ // Start a new scope. You don't *have* to do this
    let file = match File::open("test.txt") {
        Ok(file) => file,
        Err(err) => {
            // do proper error handling
            return;
        }
    };
    // read file
    if condition {
        // out of scope - automatically closed
        return;
    }

    // out of scope - automatically closed
}

println!("File read");

После написания этого мне пришлось снова взглянуть на код, думая: “вот и все”. Как вы можете видеть, мне явно больше всего нравится Rust. Java 7 тоже хороша. Go – это хорошо, но операторы defer выполняются только на основе функции и, а не на основе области действия. Вы, конечно, можете закрыть его вручную, но это тоже отстой. С другой стороны, с типами ошибок Go удивительно работать. ошибки. Новое ("пользовательская ошибка") удивительно. Java не так уж плоха, но Rust – “худший” для нас, ленивых людей, но и самый мощный. Плюс есть макросы, которые это исправляют.

Оригинал: “https://dev.to/legolord208/comparing-error-handling-in-java-go-and-rust”