Статьи

Попробуй поймать на Голанге

Golang в отличие от Java не имеет исключений, блоки try / catch / finally. Он имеет строгую обработку ошибок, функции с именем panic и restore и оператор с именем defer. Это совершенно другой подход. Это лучше или Java-подход лучше? (Извините, что я продолжаю сравнивать это с Java. Я из мира Java.)

Когда мы обрабатываем исключительные случаи в Java, мы заключаем команды в блок try, обозначающий, что может произойти что-то, что мы хотим обработать позже в блоке catch. Затем у нас есть блок finally, который содержит все вещи, которые должны быть выполнены, несмотря ни на что. Проблема этого подхода заключается в том, что он разделяет команды, относящиеся к одной и той же проблеме. Мы хотим разобраться с каким-нибудь файлом. Итак, мы открываем файл и позже, несмотря ни на что, мы хотим закрыть его. Когда программист пишет блок finally, открытие файла происходит далеко где-то в начале метода. Чтобы запомнить все, что мы должны сделать, чтобы очистить действия в начале метода, вы должны прокрутить до начала метода, с которого начинается блок try.

Ладно! Я знаю, что ваш метод слишком длинный, если вам нужно прокрутить назад. Ваши методы следуют принципам чистого кода и не длиннее десяти строк, включая JavaDoc. Хотя проблема все еще там. Он сформулирован в соответствии с порядком, в котором ожидается исполнение, а не в соответствии с порядком, который диктует логика. Логика говорит следующее: если я открою файл, я захочу закрыть его. Если я выделю какой-то ресурс, я захочу его освободить. Лучше держать проблемы вместе. Мы не программируем на ассемблере, где вы пишете мнемонику в строгом порядке исполнения. Мы определяем алгоритмическое решение на языке высокого уровня, и компилятор сгенерирует сборку. Реальная работа должна выполняться мозгом, механическая работа — для процессора. В наши дни у нас есть процессоры.

Голанг имеет команду «отсрочить» для этой цели. Вы открываете файл и упоминаете в следующей строке, что хотите, чтобы он был закрыт через некоторое время, вызывая функцию, которую вы предоставляете. Это гораздо лучший подход, который также знают разработчики языка Java, поэтому он вводит интерфейс «closeable» и оператор try-with-resources.

Тем не менее, программисты, пришедшие из мира Java, начали знакомиться с Go и хотят обрабатывать исключения. Если вы действительно хотите, вы можете имитировать его в Go. Это не будет то же самое, и я не совсем понимаю, зачем разрушать что-то хорошее для чего-то старого и посредственного, но вы можете написать

01
02
03
04
05
06
07
08
09
10
11
12
Block{
        Try: func() {
            fmt.Println("I tried")
            Throw("Oh,...sh...")
        },
        Catch: func(e Exception) {
            fmt.Printf("Caught %v\n", e)
        },
        Finally: func() {
            fmt.Println("Finally...")
        },
    }.Do()

Домашнее задание: узнайте пример кода перед этими строками (конструкторами Go), которые делают это возможным. Решение здесь: https://play.golang.org/p/LXroobH8SM

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main
 
import (
    "fmt"
)
 
type Block struct {
    Try     func()
    Catch   func(Exception)
    Finally func()
}
 
type Exception interface{}
 
func Throw(up Exception) {
    panic(up)
}
 
func (tcf Block) Do() {
    if tcf.Finally != nil {
 
        defer tcf.Finally()
    }
    if tcf.Catch != nil {
        defer func() {
            if r := recover(); r != nil {
                tcf.Catch(r)
            }
        }()
    }
    tcf.Try()
}
 
func main() {
    fmt.Println("We started")
    Block{
        Try: func() {
            fmt.Println("I tried")
            Throw("Oh,...sh...")
        },
        Catch: func(e Exception) {
            fmt.Printf("Caught %v\n", e)
        },
        Finally: func() {
            fmt.Println("Finally...")
        },
    }.Do()
    fmt.Println("We went on")
}

См. Также недавнее подобное решение на сайте http://hackthology.com/exceptions-for-go-as-a-library.html от Тим Хендерсон

Ссылка: Попробуйте и поймайте Голанг от нашего партнера JCG Питера Верхаса в блоге Java Deep .