aboutsummaryrefslogtreecommitdiff
/* guile-xapian --- Guile bindings for Xapian
 * Copyright © 2023 Arun Isaac <arunisaac@systemreboot.net>
 *
 * This file is part of guile-xapian.
 *
 * guile-xapian is free software: you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 2 of the
 * License, or (at your option) any later version.
 *
 * guile-xapian is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with guile-xapian.  If not, see
 * <https://www.gnu.org/licenses/>.
 */

%{
void handle_exception() {
  string msg;
  try {
    throw;
  } catch (const Xapian::Error &e) {
    // TODO: Handle each Xapian error class separately and raise
    // different scheme conditions for each.
    msg = e.get_description();
  } catch (const std::exception &e) {
    msg = "std::exception: ";
    msg += e.what();
  } catch (...) {
    msg = "unknown error in Xapian";
  }
  scm_call_1(scm_c_public_ref("xapian error", "raise-xapian-exception"),
             scm_from_stringn(msg.c_str(),
                              msg.length(),
                              "us-ascii",
                              SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE));
}
%}

%exception {
    try {
	$function
    } catch (...) {
      handle_exception();
    }
}