在为 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);
}