Одной из основных целей языка Sling всегда было стремление упростить жизнь и уменьшить потребность в наборе текста, а также уменьшить общий объем исходного кода, необходимого для выполнения чего-либо. И одна из наиболее раздражающих повторяющихся вещей, на которые лично я как программист трачу много времени и нажимаю клавиши, — это оператор try-catch. Вы знаете, это классика, вы хотите прочитать файл (ничего сложного, ничего страшного)..

data = Files.readAllBytes(path);

И, как уже знают все Java-программисты, если вы попробуете это сделать, вас ждет большое разочарование…

error: unreported exception IOException; must be caught or declared to be thrown

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

try {
    data = Files.readAllBytes(path);
}
catch(Exception e) {
    e.printStackTrace();
}

(И этот монстр уже значительно упрощается, используя «Exception» вместо «IOException», а затем добавляя еще больше строк кода в другом месте файла для импорта IOException..)

Таким образом, из того, что было простым однострочным текстом, язык программирования здесь заставил нас превратить его в 6-строчный с трехкратным объемом ввода. И, конечно же, это не разовый случай. За всю жизнь программиста вы будете делать это бесчисленное количество раз, снова и снова каждый день. Очевидно, время от времени вы устаёте и «ленитесь» и не хотите печатать этот printStackTrace, потому что «это всё равно не произойдёт», и со временем важные ошибки пропадают, и с нашими банковскими счетами и страховками происходят ужасные вещи ( без шуток).

Конечно, это был не Слинг. Это была Ява. Но у нас есть та же самая конструкция, классический оператор try-catch, также в Sling:

try {
    doSomething()
}
catch(e as exception) {
}

(Начиная с slingc r305, язык теперь имеет новый встроенный тип данных «Exception», который отображается на «System.Exception» для C#, «java.lang.Throwable» на Java и обычный объект на JavaScript.)

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

try {
    doSomething()
}
catch {
}

(Если для catch не задан параметр, автоматически принимается «e как исключение»)

Хотя лучше, это все равно не очень удобно, и ошибка все равно пропадает. И выполнение «трассировки стека печати» в кросс-языковой манере вовсе не является однострочным (на Java вы сделаете «e.printStackTrace()», на C# «Console.WriteLine(e.ToString())»). », в JavaScript может быть «console.log(e)»), так что там осталось много печатать. Конечно, вы можете сделать для него служебную функцию, что было бы полезно. Но для общего случая, когда вы просто перехватываете исключение и выплевываете его, мы придумали кое-что новое:

Ключевое слово trycatch

Это работает следующим образом:

trycatch {
    doSomething()
}

И, конечно же, как и всегда в Sling, однострочный блок можно сократить:

trycatch:
    doSomething()

И как частный случай ключевого слова trycatch, однострочный блок также можно превратить в один оператор:

trycatch doSomething()

Теперь все это будет переведено в такой код Java:

try {
    doSomething();
}
catch(Exception e) {
    e.printStackTrace();
}

Или такой код С#:

try {
    doSomething();
}
catch(System.Exception e) {
    System.Console.WriteLine(e.ToString());
}

Или такой код JavaScript:

try {
    doSomething();
}
catch(e) {
    console.log(e);
}

Убрано много печатного текста.

Но подождите, это еще не все!

Ключевое слово trycatch также может использоваться как выражение. Выражение trycatch принимает значение true, если блок выполняется без исключений, или false, если исключения встречаются. Таким образом, вы можете делать такие вещи:

if not trycatch doSomething() {
    PRINT "Error took place"
    return false
}

Но, конечно же, оператор assert предназначен для того, чтобы сделать его короче:

assert trycatch doSomething():
    PRINT "Error took place"

В итоге получается действительно богатое заявление, упакованное в маленькое пространство. Это эквивалентно следующему коду C#:

if (!((System.Func<bool>)(() =>
{
    try
    {
        doSomething();
    }
    catch (System.Exception e)
    {
        System.Console.WriteLine (e.ToString());
        return (false);
    }
    return (true);
}))())
{
    System.Console.WriteLine ("Error took place");
    return (false);
}

Или следующее в Java:

if(!(new Object() {
    public boolean execute() {
        try {
            doSomething();
        }
        catch(java.lang.Throwable e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}.execute())) {
    System.out.println("Error took place");
    return(false);
}

Или что-то очень похожее в JavaScript.

Ключевое слово trycatch вместе с типом данных исключения теперь доступно в slingc r305 и новее. Просто используйте интерфейс командной строки Eqela для создания и обновления файла build.qx с помощью:

use eqela:sling:r305

Удачного взлома.