summaryrefslogtreecommitdiff
path: root/except.i
blob: fce14718451d48e3cbb7e93381da8a64a41e9fb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/* 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();
    }
}