ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
EH
quality · 2 min read

error handling patterns

Error handling is a crucial aspect of building robust and reliable APIs. In this section, we'll explore common error handling patterns used in the Apiary…

Error handling is a crucial aspect of building robust and reliable APIs. In this section, we'll explore common error handling patterns used in the Apiary platform, where founders can command in English and Apiary generates code.

Throwing Errors vs Returning Results

When it comes to error handling, there are two primary approaches: throwing errors or returning results. While both methods have their use cases, they serve different purposes.

Throwing Errors

Throwing errors is a more traditional approach to error handling. When an error occurs, the function throws an exception that can be caught by the caller. This allows for explicit error handling and provides more control over how errors are propagated.

def divide(x, y):
    if y == 0:
        raise ValueError("Cannot divide by zero")
    return x / y

In this example, if y is zero, a ValueError exception is thrown.

Returning Results

Returning results, on the other hand, involves returning an object that indicates success or failure. This approach is commonly used in functional programming languages and can be more elegant than throwing errors.

def divide(x, y):
    if y == 0:
        return Result.failure("Cannot divide by zero")
    return Result.success(x / y)

In this example, a Result object is returned, which can either contain the result of the operation or an error message.

Where to Catch Errors

When throwing errors, it's essential to consider where to catch them. In general, it's best to catch errors as close to their origin as possible, allowing for more specific and targeted error handling.

try:
    result = divide(10, 0)
except ValueError as e:
    print(f"Error: {e}")

In this example, the ValueError exception is caught in the same scope where it's thrown.

Silently Logging vs Alerting

When an error occurs, there are two common approaches to handling it: silently logging or alerting. While both methods have their use cases, they serve different purposes.

Silently Logging

Silently logging involves logging the error without taking any further action. This approach is useful when errors are expected and can be safely ignored.

import logging

def divide(x, y):
    if y == 0:
        logging.error("Cannot divide by zero")
        return None
    return x / y

In this example, the error is logged without raising an exception.

Alerting

Alerting involves taking explicit action when an error occurs. This approach is useful when errors are critical and require immediate attention.

import smtplib

def divide(x, y):
    if y == 0:
        # Send email to administrator
        send_email("Error: Cannot divide by zero")
        raise ValueError("Cannot divide by zero")
    return x / y

In this example, an email is sent to the administrator when an error occurs.

Conclusion

Error handling is a critical aspect of building robust and reliable APIs. By understanding common patterns such as throwing errors vs returning results, where to catch errors, and silently logging vs alerting, developers can write more resilient code that handles unexpected situations effectively.

Related:

Sources:

Frequently asked
What is error handling patterns about?
Error handling is a crucial aspect of building robust and reliable APIs. In this section, we'll explore common error handling patterns used in the Apiary…
What should you know about throwing Errors vs Returning Results?
When it comes to error handling, there are two primary approaches: throwing errors or returning results. While both methods have their use cases, they serve different purposes.
What should you know about throwing Errors?
Throwing errors is a more traditional approach to error handling. When an error occurs, the function throws an exception that can be caught by the caller. This allows for explicit error handling and provides more control over how errors are propagated.
What should you know about returning Results?
Returning results, on the other hand, involves returning an object that indicates success or failure. This approach is commonly used in functional programming languages and can be more elegant than throwing errors.
What should you know about where to Catch Errors?
When throwing errors, it's essential to consider where to catch them. In general, it's best to catch errors as close to their origin as possible, allowing for more specific and targeted error handling.
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room