Skip to content

Errors

Alerts are very useful but as we scale the number of automation it can become very difficult to diagnose issues and verify which tasks generated errors.

Using the Errors feature you can easily identify tasks that caused errors. You can filter them by task ID, automation label, and period.

Error-filter

Within each error, there is a visualization option where it is possible to see in detail what occurred.

Erros-view

You can also extend it to include the following:

Detailed Error

Erros-details

StackTrace

stackTrace

Screenshot

Erros-screenshot

Tags

Tags

Attachments

Attachments

This way, it is possible to have more control to manage, identify, and correct errors.

How to record errors using the Maestro SDK

You can easily record errors to the platform using the Maestro SDK in your automation code.

Installation

If you don't have the dependency installed yet, just follow these instructions:

pip install botcity-maestro-sdk

Important

In addition to installing, remember to include the dependency in the bot's requirements.txt file.

<repositories>
    <repository>
        <id>nexus-botcity-public</id>
        <url>https://devtools.botcity.dev:8081/repository/botcity-public/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

<dependencies>
    <!-- Your other dependencies -->
    <dependency>
        <groupId>dev.botcity</groupId>
        <artifactId>maestro-sdk</artifactId>
        <version>2.0.3</version>
    </dependency>
</dependencies>
npm i @botcity/botcity-maestro-sdk
npm i @botcity/botcity-maestro-sdk

Importing the SDK

After installation, import the dependency and instantiate the Maestro SDK:

# Import for integration with BotCity Maestro SDK
from botcity.maestro import *

# Disable errors if we are not connected to Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

# Instantiating the Maestro SDK
maestro = BotMaestroSDK.from_sys_args()
# Fetching the details of the current task being executed
execution = maestro.get_execution()
// Import for integration with BotCity Maestro SDK
import dev.botcity.maestro_sdk.*;
...

public void action(BotExecution botExecution) {

    try {
        // Instantiating the Maestro SDK
        BotMaestroSDK maestro = new BotMaestroSDK();
        maestro.login(botExecution);
    ...
// Import for integration with BotCity Maestro SDK
const { BotMaestroSdk } = require('@botcity/botcity-maestro-sdk')

// Getting parameters passed by Runner
const args = process.argv.slice(2)
const [server, taskid, token] = args

// Login with information from the Dev. Environment page
const maestro = new BotMaestroSdk()
maestro.login("YOUR_SERVER_HERE", "YOUR_USER_HERE", "YOUR_KEY_HERE")

// Fetching the details of the current task being executed
const executionTask = await maestro.getTask(taskid)
// Import for integration with BotCity Maestro SDK
import { BotMaestroSdk } from '@botcity/botcity-maestro-sdk'

// Getting parameters passed by Runner
const args = process.argv.slice(2)
const [server, taskid, token] = args

// Login with information from the Dev. Environment page
const maestro: BotMaestroSdk = new BotMaestroSdk()
maestro.login("YOUR_SERVER_HERE", "YOUR_USER_HERE", "YOUR_KEY_HERE")

// Fetching the details of the current task being executed
const executionTask: Task = await maestro.getTask(taskid)

Recording an error

# Recording error in Maestro
try:
    div = 0 / 0
except Exception as error:
    maestro.error(task_id=execution.task_id, exception=error)
// Recording error in Maestro
try {
    int div = 0/0;
} catch (Exception error) {
    maestro.createError(botExecution.getTaskId(), error, null, null, null);
}
// Recording error in Maestro
try {
    eval("hoo bar");
} catch (error) {
    await maestro.createError(executionTask.id, error)
}
// Recording error in Maestro
try {
    eval("hoo bar");
} catch (error: any) {
    await maestro.createError(executionTask.id, error)
}

Complete code

from botcity.core import DesktopBot
from botcity.maestro import *

# Disable errors if we are not connected to Maestro
BotMaestroSDK.RAISE_NOT_CONNECTED = False

def main():
    maestro = BotMaestroSDK.from_sys_args()
    execution = maestro.get_execution()

    # Recording error in Maestro
    try:
        bot = DesktopBot()
        # Implement here your logic...
        ...

        # Forcing an error
        div = 0 / 0

    except Exception as error:
        maestro.error(task_id=execution.task_id, exception=error)

def not_found(label):
    print(f"Element not found: {label}")

if __name__ == '__main__':
    main()
import dev.botcity.framework.bot.DesktopBot;
import dev.botcity.maestro_sdk.BotExecutor;
import dev.botcity.maestro_sdk.BotMaestroSDK;
import dev.botcity.maestro_sdk.runner.BotExecution;
import dev.botcity.maestro_sdk.runner.RunnableAgent;

public class FirstBot extends DesktopBot implements RunnableAgent
{
    public FirstBot() {
        try {
            setResourceClassLoader(this.getClass().getClassLoader());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void action(BotExecution botExecution) {

        try {
            BotMaestroSDK maestro = new BotMaestroSDK();
            maestro.login(botExecution);

            // Recording error in Maestro
            try {
                // Implement here your logic...
                ...

                // Forcing an error
                int div = 0/0;

            } catch (Exception error) {
                maestro.createError(botExecution.getTaskId(), error, null, null, null);
            }

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

    private void notFound(String label) {
        System.out.println("Element not found: "+label);
    }

    public static void main(String[] args) {
        BotExecutor.run(new FirstBot(), args);
    }
}
const main = async () => {
    const { BotMaestroSdk } = require('@botcity/botcity-maestro-sdk')

    const args = process.argv.slice(2)
    const [server, taskid, token] = args

    const maestro = new BotMaestroSdk()
    maestro.login("YOUR_SERVER_HERE", "YOUR_USER_HERE", "YOUR_KEY_HERE")

    const executionTask = await maestro.getTask(taskid)

    // Recording error in Maestro
    try {
        eval("hoo bar");
    } catch (error) {
        await maestro.createError(executionTask.id, error)
    }
}

main()
const main = async () => {
    import { BotMaestroSdk } from '@botcity/botcity-maestro-sdk'

    const args = process.argv.slice(2)
    const [server, taskid, token] = args

    const maestro: BotMaestroSdk = new BotMaestroSdk()
    maestro.login("YOUR_SERVER_HERE", "YOUR_USER_HERE", "YOUR_KEY_HERE")

    const executionTask: Task = await maestro.getTask(taskid)

    // Recording error in Maestro
    try {
        eval("hoo bar");
    } catch (error: any) {
        await maestro.createError(executionTask.id, error)
    }
}

main()

Tip

Look at the other operations we can do when recording errors using BotCity Maestro SDK, including screenshots, tags, and attachments when reporting the error.