Една от основните цели на езика 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();
}

(И това чудовище вече е значително опростено чрез използване на „Изключение“ вместо „IOException“ и след това добавяне на още редове код на различно място във файла, за да импортирате IOException..)

Така че от това, което беше обикновен едноредов, езикът за програмиране тук ни принуди да го превърнем в 6-редов с три пъти по-голямо количество писане. И разбира се това не е еднократен инцидент. През целия живот на един програмист човек ще прави това безброй пъти, отново и отново всеки ден. Очевидно от време на време се уморявате и се „мързеливите“ и не искате да въвеждате този printStackTrace, защото „това така или иначе няма да се случи“, и с течение на времето важни грешки изчезват и се случват ужасни неща с нашите банкови сметки и застраховки ( без майтап).

Разбира се, това не беше Слинг. Това беше Java. Но имаме същата конструкция, класическия оператор try-catch, също в Sling:

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

(Считано от slingc r305, езикът вече има нов вграден тип данни „изключение“, който се преобразува в „System.Exception“ за C#, „java.lang.Throwable“ в Java и обикновен обект в JavaScript.)

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

try {
    doSomething()
}
catch {
}

(Ако не е даден параметър за улавяне, автоматично се приема „e като изключение“)

Макар и по-добре, това все още не е толкова удобно и грешката все още липсва. И извършването на „print stack trace“ по междуезичен начин изобщо не е едноредов (на 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();
}

Или този вид C# код:

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

Приятно хакване.