X DevAPI 用户指南  / 第 8 章语句执行  / 8.1 交易处理  /  8.1.2 错误处理

8.1.2 错误处理

在为 MySQL Shell 编写脚本时,您通常可以简单地依赖 MySQL Shell 完成的异常处理。对于所有其他语言,要么需要适当的异常处理来捕获错误,要么如果该语言不支持异常,则需要使用传统的错误处理模式。

可以通过创建自定义 SessionContext并将其传递给 mysqlx.getSession()函数来更改默认错误处理。这使得从异常切换到基于结果的错误检查成为可能。

以下示例显示了如何执行正确的错误处理。该示例假定测试模式存在并且集合my_collection存在。

MySQL 外壳 JavaScript 代码

var mysqlx = require('mysqlx');

var mySession;

try {
  // Connect to server on localhost
  mySession = mysqlx.getSession( {
    host: 'localhost', port: 33060,
    user: 'user', password: 'password' } );
}
catch (err) {
  print('The database session could not be opened: ' + err.message);
}

try {
  var myDb = mySession.getSchema('test');

  // Use the collection 'my_collection'
  var myColl = myDb.getCollection('my_collection');

  // Find a document
  var myDoc = myColl.find('name like :param').limit(1)
    .bind('param','L%').execute();

  // Print document
  print(myDoc.first());
}
catch (err) {
  print('The following error occurred: ' + err.message);
}
finally {
  // Close the session in any case
  mySession.close();
}

MySQL 外壳 Python 代码

from mysqlsh import mysqlx

mySession

try:
        # Connect to server on localhost
        mySession = mysqlx.get_session( {
                'host': 'localhost', 'port': 33060,
                'user': 'user', 'password': 'password' } )

except Exception as err:
        print('The database session could not be opened: %s' % str(err))

try:
        myDb = mySession.get_schema('test')

        # Use the collection 'my_collection'
        myColl = myDb.get_collection('my_collection')

        # Find a document
        myDoc = myColl.find('name like :param').limit(1).bind('param','L%').execute()

        # Print document
        print(myDoc.first())
except Exception as err:
        print('The following error occurred: %s' % str(err))
finally:
        # Close the session in any case
        mySession.close()

Node.js JavaScript 代码

var mysqlx = require('@mysql/xdevapi');

// Connect to server on localhost
mysqlx
  .getSession({
    host: 'localhost',
    port: 33060,
    user: 'user',
    password: 'password'
  })
  .then(function (mySession) {
    // This can't throw an error as we check existence at a later operation only
    var myDb = mySession.getSchema('test');

    // Use the collection 'my_collection'
    // This can't throw an error as we check existence at a later operation only
    var myColl = myDb.getCollection('my_collection');

    // Find a document
    return myColl
      .find('name like :param')
      .limit(1)
      .bind('param','L%')
      .execute(function (row) {
        console.log(row);
      })
      .then(function () {
        return session.close();
      })
      .catch(function (err) {
        console.log('The following error occurred: ' + err.message);
      });
  })
  .catch (err) {
    console.log('The database session could not be opened: ' + err.message);
  });

C#代码

Session mySession = null;
try
{
  // Connect to server on localhost
  mySession = MySQLX.GetSession("mysqlx://user:password@localhost:33060");
 
  try
  {
    Schema myDb = mySession.GetSchema("test");
 
    // Use the collection 'my_collection'
    Collection myColl = myDb.GetCollection("my_collection");
 
    // Find a document
    DocResult myDoc = myColl.Find("name like :param").Limit(1).Bind("param", "L%").Execute();
 
    // Print document
    Console.WriteLine(myDoc.FetchOne());
  }
  catch (Exception err)
  {
    Console.WriteLine("The following error occurred: " + err.Message);
  }
  finally
  {
    // Close the session in any case
    mySession.Close();
  }
}
catch (Exception err)
{
  Console.WriteLine("The database session could not be opened: " + err.Message);
}

Python代码

import mysqlx

# Connect to server
my_session = mysqlx.get_session({
    'host': 'localhost', 'port': 33060,
    'user': 'user', 'password': 'password'
})

# Get the Schema test
my_schema = my_session.get_schema('test')

# Create a new collection
my_coll = my_schema.create_collection('my_collection')

# Start a transaction
my_session.start_transaction()
try:
    my_coll.add({'name': 'Rohit', 'age': 18, 'height': 1.76}).execute()
    my_coll.add({'name': 'Misaki', 'age': 24, 'height': 1.65}).execute()
    my_coll.add({'name': 'Leon', 'age': 39, 'height': 1.9}).execute()

    # Commit the transaction if everything went well
    result = my_session.commit()

    # handle warnings
    if result.get_warnings_count() > 0:
        for warning in result.get_warnings():
            print('Type [{0}] (Code {1}): {2}'.format(warning['level'], warning['code'], warning['msg']))

    print('Data inserted successfully.')
except Exception as err:
    # Rollback the transaction in case of an error
    my_session.rollback()

    # handle warnings
    if reply.get_warnings_count() > 0:
        for warning in result.get_warnings():
            print('Type [{0}] (Code {1}): {2}'.format(warning['level'], warning['code'], warning['msg']))

    # Printing the error message
    print('Data could not be inserted: {0}'.format(err))

Java代码

import com.mysql.cj.xdevapi.*;

Session mySession;

try {
    // Connect to server on localhost
    mySession = new SessionFactory().getSession("mysqlx://localhost:33060/test?user=user&password=password");

    try {
        Schema myDb = mySession.getSchema("test");

        // Use the collection 'my_collection'
        Collection myColl = myDb.getCollection("my_collection");

        // Find a document
        DocResult myDoc = myColl.find("name like :param").limit(1).bind("param", "L%").execute();

        // Print document
        System.out.println(myDoc.fetchOne());
    } catch (XDevAPIError err) { // special exception class for server errors
        System.err.println("The following error occurred: " + err.getMessage());
    } finally {
        // Close the session in any case
        mySession.close();
    }
} catch (Exception err) {
    System.err.println("The database session could not be opened: " + err.getMessage());
}

C++代码

#include <mysqlx/xdevapi.h>

try
{
  // Connect to server on localhost
  Session session(33060, "user", "password");

  try
  {
    Schema db = session.getSchema("test");

    // Use the collection 'my_collection'
    Collection myColl = db.getCollection("my_collection");

    // Find a document
    auto myDoc = myColl.find("name like :param").limit(1)
                       .bind("param", "L%").execute();

    // Print document
    cout << myDoc.fetchOne() << endl;

    // Exit with success code
    exit(0);
  }
  catch (const Error &err)
  {
    cout << "The following error occurred: " << err << endl;
    exit(1);
  }

  // Note: session is closed automatically when session object
  // is destructed.
}
catch (const Error &err)
{
  cout << "The database session could not be opened: " << err << endl;

  // Exit with error code
  exit(1);
}