Error Handling
The Eriksson Beam API uses specific exception types to indicate different error conditions. This guide covers all exception types and recommended handling strategies.
Exception Types
ErikssonBeamNotRunningException
When thrown: Eriksson Beam process is not running or not responding.
Common causes:
- Eriksson Beam hasn't been started
- Process crashed or was closed
- 10-minute idle timeout exceeded
- Process ID doesn't match a running instance
Example:
try
{
var client = await ErikssonBeamFinder.GetFirstSupportedBeamClient(args);
}
catch (ErikssonBeamNotRunningException ex)
{
Console.WriteLine("Eriksson Beam is not running.");
Console.WriteLine("Please start Eriksson Beam and try again within 10 minutes.");
}
ErikssonBeamConnectionException
When thrown: Connection to Eriksson Beam failed.
Common causes:
- Named pipe not available
- Connection refused
- Network/IPC issues
Example:
try
{
var client = await ErikssonBeamClient.AttemptConnection(args);
}
catch (ErikssonBeamConnectionException ex)
{
Console.WriteLine($"Connection failed: {ex.Message}");
Console.WriteLine("Try restarting Eriksson Beam.");
}
ServerErrorException
When thrown: Server processed the request but returned an error.
Access error details:
catch (ServerErrorException ex)
{
ResponseCode code = ex.Response.ResponseCode;
string message = ex.Response.ErrorMessage;
}
Response codes:
| Code | Meaning |
|---|---|
Success |
Operation succeeded (not thrown) |
InternalServerError |
Unexpected server error |
LicenseError |
Invalid or expired license key |
VersionError |
API version mismatch |
Unauthorized |
Not authorized for this operation |
InvalidRequest |
Malformed or invalid request |
Timeout |
Server-side timeout |
ServerBusy |
Server is processing another request |
Uninitialized |
Server not ready |
Example:
try
{
await client.PushBeamDesignerAsync("project", design);
}
catch (ServerErrorException ex)
{
switch (ex.Response.ResponseCode)
{
case ResponseCode.LicenseError:
Console.WriteLine("License validation failed.");
Console.WriteLine("Please check your license key.");
break;
case ResponseCode.InvalidRequest:
Console.WriteLine($"Invalid data: {ex.Response.ErrorMessage}");
break;
case ResponseCode.InternalServerError:
Console.WriteLine($"Server error: {ex.Response.ErrorMessage}");
break;
default:
Console.WriteLine($"Error ({ex.Response.ResponseCode}): {ex.Response.ErrorMessage}");
break;
}
}
UnexpectedMessageException
When thrown: Server sent an unexpected response type.
Common causes:
- Protocol mismatch
- API version incompatibility
- Internal communication error
Resolution: This usually indicates a bug. Contact support with details.
catch (UnexpectedMessageException ex)
{
Console.WriteLine($"Unexpected response: {ex.Message}");
Console.WriteLine("This may indicate a version mismatch.");
}
MessageReadException
When thrown: Failed to parse server response.
Common causes:
- Corrupted response
- Serialization error
- Connection interrupted during transfer
Resolution: Retry the operation. If persistent, restart Eriksson Beam.
catch (MessageReadException ex)
{
Console.WriteLine($"Failed to read response: {ex.Message}");
Console.WriteLine("Retrying...");
// Implement retry logic
}
InvalidRequestException
When thrown: Client sent an invalid request.
Common causes:
- Internal validation failure
- Malformed request construction
Resolution: Usually indicates a bug in the API usage. Check parameters.
Standard .NET Exceptions
| Exception | When Thrown |
|---|---|
ArgumentNullException |
Null parameter passed to method |
ArgumentException |
Invalid parameter value (e.g., ProcessID <= 0) |
ObjectDisposedException |
Using disposed client/launcher |
OperationCanceledException |
Timeout exceeded |
TimeoutException |
Connection attempts exhausted |
Recommended Error Handling Pattern
public async Task<bool> SafeUpdateDesign(
ErikssonBeamClient client,
string project,
Action<BeamDesign> modifier)
{
try
{
// Pull current design
var design = await client.PullBeamDesignerAsync(project);
// Apply modifications
modifier(design);
// Push changes
await client.PushBeamDesignerAsync(project, design);
return true;
}
catch (ErikssonBeamNotRunningException)
{
Console.WriteLine("Error: Eriksson Beam is not running.");
Console.WriteLine("Start Eriksson Beam and try again.");
return false;
}
catch (ServerErrorException ex) when (ex.Response.ResponseCode == ResponseCode.LicenseError)
{
Console.WriteLine("Error: License validation failed.");
return false;
}
catch (ServerErrorException ex)
{
Console.WriteLine($"Server error: {ex.Response.ErrorMessage}");
return false;
}
catch (OperationCanceledException)
{
Console.WriteLine("Error: Operation timed out.");
Console.WriteLine("Increase IdleTimeoutMs or check connection.");
return false;
}
catch (ObjectDisposedException)
{
Console.WriteLine("Error: Client has been disposed.");
return false;
}
}
Retry Strategy
For transient errors, implement retry with exponential backoff:
public async Task<T> WithRetry<T>(
Func<Task<T>> operation,
int maxRetries = 3,
int initialDelayMs = 1000)
{
int delay = initialDelayMs;
for (int attempt = 1; attempt <= maxRetries; attempt++)
{
try
{
return await operation();
}
catch (ErikssonBeamConnectionException) when (attempt < maxRetries)
{
Console.WriteLine($"Attempt {attempt} failed. Retrying in {delay}ms...");
await Task.Delay(delay);
delay *= 2; // Exponential backoff
}
catch (MessageReadException) when (attempt < maxRetries)
{
Console.WriteLine($"Read error. Retrying in {delay}ms...");
await Task.Delay(delay);
delay *= 2;
}
}
throw new Exception("Max retries exceeded");
}
// Usage
var design = await WithRetry(() => client.PullBeamDesignerAsync("project"));
Logging Errors
Use the optional ILogger parameter for diagnostic logging:
using Microsoft.Extensions.Logging;
var loggerFactory = LoggerFactory.Create(builder =>
{
builder
.AddConsole()
.SetMinimumLevel(LogLevel.Debug);
});
var logger = loggerFactory.CreateLogger<Program>();
var client = await ErikssonBeamClient.AttemptConnection(args, logger);
See Also
- Connection Methods - Connection options
- Best Practices - Recommended patterns
- Troubleshooting - Problem resolution