Skip to main content

Error Codes

1. Overview​

WebGLHost C++ SDK error codes are defined in the IBrowsingService.h header file.

2. Error Code Definitions​

// Error codes
#define WMPF_ERRCODE_SUCCESS 0
#define WMPF_ERRCODE_FAIL -1
#define WMPF_ERRCODE_INVALID_PARAM -2
#define WMPF_ERRCODE_NOT_INITIALIZED -3
#define WMPF_ERRCODE_ALREADY_INITIALIZED -4

3. Error Code Details​

3.1 WMPF_ERRCODE_SUCCESS (0)​

Description: Operation completed successfully

Return Scenarios:

  • InitializeBrowsingCore initialization successful
  • QueryInterface query successful
  • Game launch successful (via LaunchCallback)

Code Example:

int result = service->InitializeBrowsingCore(config, "", &handler);

if (result == WMPF_ERRCODE_SUCCESS) {
std::cout << "Initialization successful!" << std::endl;
}

3.2 WMPF_ERRCODE_FAIL (-1)​

Description: General failure error

Possible Causes:

  • Runtime startup failed
  • Runtime file does not exist or is corrupted
  • Insufficient system resources
  • Network request failed

Return Scenarios:

  • InitializeBrowsingCore initialization failed
  • QueryInterface querying non-existent interface
  • Game launch failed (runtime error)

Code Example:

int result = service->InitializeBrowsingCore(config, "", &handler);

if (result == WMPF_ERRCODE_FAIL) {
std::cerr << "Initialization failed!" << std::endl;
std::cerr << "Possible causes:" << std::endl;
std::cerr << " - Runtime not found" << std::endl;
std::cerr << " - Invalid configuration" << std::endl;
}

Troubleshooting Steps:

  1. Check if runtime path is correct
  2. Confirm runtime file exists and is executable
  3. Check system logs and SDK logs
  4. Verify network connection (if remote resources needed)

3.3 WMPF_ERRCODE_INVALID_PARAM (-2)​

Description: Invalid parameter

Possible Causes:

  • config JSON format is incorrect
  • Required parameters are missing (e.g., sdkKey, sdkSecret)
  • Parameter values are invalid
  • Passed nullptr where a valid pointer was expected

Return Scenarios:

  • InitializeBrowsingCore configuration parameter error
  • QueryInterface passed invalid type name or nullptr output pointer

Code Example:

// Bad: Invalid JSON format
const char* badConfig = "{sdkKey: no-quotes}"; // Missing quotes

int result = service->InitializeBrowsingCore(badConfig, "", nullptr);

if (result == WMPF_ERRCODE_INVALID_PARAM) {
std::cerr << "Invalid parameters!" << std::endl;
std::cerr << "Check your configuration JSON format" << std::endl;
}

Correct Configuration Format:

// Good: Valid JSON
const char* goodConfig = R"({
"sdkKey": "your-sdk-key",
"sdkSecret": "your-sdk-secret",
"debug": true
})";

int result = service->InitializeBrowsingCore(goodConfig, "", nullptr);

3.4 WMPF_ERRCODE_NOT_INITIALIZED (-3)​

Description: SDK not initialized

Possible Causes:

  • Attempting to use SDK features before calling InitializeBrowsingCore
  • Continuing to use SDK after calling UninitializeBrowsingCore

Return Scenarios:

  • Calling SDK methods without initialization
  • Continuing to call after uninitialization

Code Example:

IBrowsingService* service = GetBrowsingService();

// Bad: Query interface before initialization
IAppletManagerV3* appletMgr = nullptr;
int result = service->QueryInterface("IAppletManagerV3", (void**)&appletMgr);

if (result == WMPF_ERRCODE_NOT_INITIALIZED) {
std::cerr << "SDK not initialized!" << std::endl;
std::cerr << "Call InitializeBrowsingCore first" << std::endl;
}

// Good: Initialize first
service->InitializeBrowsingCore(config, "", nullptr);
result = service->QueryInterface("IAppletManagerV3", (void**)&appletMgr);

3.5 WMPF_ERRCODE_ALREADY_INITIALIZED (-4)​

Description: SDK already initialized

Possible Causes:

  • Repeatedly calling InitializeBrowsingCore
  • Attempting to reinitialize without calling UninitializeBrowsingCore

Return Scenarios:

  • Calling InitializeBrowsingCore again on an already initialized service

Code Example:

IBrowsingService* service = GetBrowsingService();

// First initialization
int result = service->InitializeBrowsingCore(config, "", nullptr);
std::cout << "First init: " << result << std::endl;

// Try to initialize again
result = service->InitializeBrowsingCore(config, "", nullptr);

if (result == WMPF_ERRCODE_ALREADY_INITIALIZED) {
std::cout << "Already initialized, no need to initialize again" << std::endl;
// This is not necessarily an error - continue using the SDK
}

Handling Recommendation:

  • This is not a serious error; you can continue using the already initialized service
  • If reinitialization is needed, call UninitializeBrowsingCore first

4. Error Handling Best Practices​

4.1 Using switch Statement​

int result = service->InitializeBrowsingCore(config, "", &handler);

switch (result) {
case WMPF_ERRCODE_SUCCESS:
std::cout << "Initialization successful" << std::endl;
break;

case WMPF_ERRCODE_FAIL:
std::cerr << "Initialization failed: general error" << std::endl;
return 1;

case WMPF_ERRCODE_INVALID_PARAM:
std::cerr << "Initialization failed: invalid parameters" << std::endl;
return 1;

case WMPF_ERRCODE_NOT_INITIALIZED:
std::cerr << "Not initialized (shouldn't happen here)" << std::endl;
return 1;

case WMPF_ERRCODE_ALREADY_INITIALIZED:
std::cout << "Already initialized - continuing..." << std::endl;
break;

default:
std::cerr << "Unknown error: " << result << std::endl;
return 1;
}

4.2 Creating Error Handling Helper Function​

const char* GetErrorString(int errorCode) {
switch (errorCode) {
case WMPF_ERRCODE_SUCCESS:
return "Success";
case WMPF_ERRCODE_FAIL:
return "General failure";
case WMPF_ERRCODE_INVALID_PARAM:
return "Invalid parameter";
case WMPF_ERRCODE_NOT_INITIALIZED:
return "Not initialized";
case WMPF_ERRCODE_ALREADY_INITIALIZED:
return "Already initialized";
default:
return "Unknown error";
}
}

// Usage
int result = service->InitializeBrowsingCore(config, "", nullptr);
std::cout << "Result: " << GetErrorString(result) << std::endl;

4.3 Logging​

void LogError(const char* operation, int errorCode) {
std::cerr << "[ERROR] " << operation << " failed with code "
<< errorCode << " (" << GetErrorString(errorCode) << ")"
<< std::endl;
}

// Usage
int result = service->InitializeBrowsingCore(config, "", nullptr);
if (result != WMPF_ERRCODE_SUCCESS) {
LogError("InitializeBrowsingCore", result);
}

5. Game Launch Error Codes​

Game launch returns error codes via LaunchCallback:

void OnLaunchComplete(const char* app_id, int result_code, const char* error_desc) {
if (result_code == WMPF_ERRCODE_SUCCESS) {
std::cout << "Game launched: " << app_id << std::endl;
} else {
std::cerr << "Game launch failed" << std::endl;
std::cerr << " App ID: " << app_id << std::endl;
std::cerr << " Error code: " << result_code << std::endl;
std::cerr << " Description: " << (error_desc ? error_desc : "N/A") << std::endl;

// Handle specific errors
switch (result_code) {
case WMPF_ERRCODE_FAIL:
std::cerr << " Possible causes:" << std::endl;
std::cerr << " - Invalid launch key" << std::endl;
std::cerr << " - Network error" << std::endl;
std::cerr << " - Game file download failed" << std::endl;
break;

case WMPF_ERRCODE_INVALID_PARAM:
std::cerr << " Check launch configuration JSON" << std::endl;
break;
}
}
}

6. Complete Error Handling Example​

#include <iostream>
#include "IBrowsingService.h"
#include "IAppletManagerV3.h"

class ErrorHandler {
public:
static const char* GetErrorString(int code) {
switch (code) {
case WMPF_ERRCODE_SUCCESS: return "Success";
case WMPF_ERRCODE_FAIL: return "Failure";
case WMPF_ERRCODE_INVALID_PARAM: return "Invalid parameter";
case WMPF_ERRCODE_NOT_INITIALIZED: return "Not initialized";
case WMPF_ERRCODE_ALREADY_INITIALIZED: return "Already initialized";
default: return "Unknown";
}
}

static void LogResult(const char* operation, int code) {
if (code == WMPF_ERRCODE_SUCCESS) {
std::cout << "[OK] " << operation << " succeeded" << std::endl;
} else {
std::cerr << "[ERROR] " << operation << " failed: "
<< GetErrorString(code) << " (" << code << ")" << std::endl;
}
}

static bool HandleError(const char* operation, int code) {
LogResult(operation, code);
return (code == WMPF_ERRCODE_SUCCESS ||
code == WMPF_ERRCODE_ALREADY_INITIALIZED);
}
};

int main() {
IBrowsingService* service = GetBrowsingService();

// Initialize
const char* config = R"({"sdkKey": "xxx", "sdkSecret": "yyy"})";
int result = service->InitializeBrowsingCore(config, "", nullptr);

if (!ErrorHandler::HandleError("Initialize", result)) {
service->Release();
return 1;
}

// Query interface
IAppletManagerV3* appletMgr = nullptr;
result = service->QueryInterface("IAppletManagerV3", (void**)&appletMgr);

if (!ErrorHandler::HandleError("QueryInterface", result)) {
service->UninitializeBrowsingCore();
service->Release();
return 1;
}

// Continue with application logic...

// Cleanup
appletMgr->Release();
service->UninitializeBrowsingCore();
service->Release();

return 0;
}

7. Important Notes​

  1. Always Check Return Values: Never assume operations succeed
  2. Error Logging: Record error details for troubleshooting
  3. User Friendly: Display understandable error messages to users
  4. Recovery Strategy: Provide retry mechanisms for recoverable errors
  5. Resource Cleanup: Properly release resources when errors occur

8. Troubleshooting Workflow​

1. Get error code
|
2. View error description (if available)
|
3. Check log files
|
4. Verify configuration parameters
|
5. Check runtime files
|
6. Confirm system resources
|
7. Try minimal example
|
8. Contact technical support