[Opensim-dev] Test before you call OSSL function

Haravikk opensim at haravikk.me
Tue Oct 15 11:36:50 UTC 2019



> On 15 Oct 2019, at 00:02, Leal Duarte <ajlduarte at sapo.pt> wrote:
> 
> yoption trycatch;
> 
> default
> {
>     state_entry()
>     {
>         llSay(0, "Script running");
>     }
>     touch_start(integer nn)
>     {
>         try
>         {
>             osSetTerrainHeight(120, 100, 30);
>             llSay(0,"terrain done ");
>         }
>         catch (exception ex)
>         {
>             PrintOutException (ex);
>         }
>         finally
>         {
>             llSay(0,"finally ");
>         }
>        }
>    }
> 
>    PrintOutException (exception ex)
>    {
>        llOwnerSay ("   typename: " + xmrExceptionTypeName (ex));
>        llOwnerSay ("   message: " + xmrExceptionMessage (ex));
>        llOwnerSay ("  stacktrace:\n" + xmrExceptionStackTrace (ex));
>    }

This is pretty much ideal, is it fully implemented in this form?

For lightweight scripting I'd say that being able to catch specific exception types is arguably overkill, and if you just use a plain (no parameter) catch then you don't really need a finally block either. For example, a simplified form is capable enough for many use cases:

    default {
        state_entry() {
            llSay(0, "Script running");
        }
        touch_start(integer x) {
            try {
                osSetTerrainHeight(120, 100, 30);
                llSay(0, "terrain done");
            } catch {
                llSay(0, "terrain failed');
            }
            llSay(0, "finally");
        }
    }

This makes sense if we assume the goal of try in an LSL script is to prevent the script from halting at all, which differs from normal try/catch in programming where it's usually more about logging errors or presenting error messages before halting anyway (or exiting gracefully instead). I suppose part of the problem is that the halting behaviour of OSSL functions is weird because it's halting a script due to a problem that isn't really the script's fault, but the region's.

The behaviour is strange because it's different from permissions errors (e.g- animating an avatar without asking permission first) which produces an error but doesn't halt the script, but it means that the purpose of try/catch is slightly different to other languages in which it is commonly used I think.


In terms of simplification, if you don't actually need to handle the error case, then if catch blocks were optional this could be simplified even further:

    default {
        state_entry() {
            llSay(0, "Script running");
        }
        touch_start(integer x) {
            try { osSetTerrainHeight(120, 100, 30); }
            llSay(0, "finally");
        }
    }

That seems pretty neat to me; if you need to know if a function succeeded you can still do:

    default {
        state_entry() {
            llSay(0, "Script running");
        }
        touch_start(integer x) {
            integer terrain_set = FALSE;
            try { osSetTerrainHeight(120, 100, 30); terrain_set = TRUE; }
            llSay(0, "finally");

            if (terrain_set) { /* Put it back to normal? */ }
        }
    }


More information about the Opensim-dev mailing list