33import requests
44import arff
55import warnings
6+ import xmltodict
67
78from . import config
8- from .exceptions import OpenMLServerError
9+ from .exceptions import OpenMLServerError , OpenMLServerException
910
1011
1112def _perform_api_call (call , data = None , file_dictionary = None ,
@@ -80,7 +81,7 @@ def _read_url_files(url, data=None, file_dictionary=None, file_elements=None):
8081 # 'gzip,deflate'
8182 response = requests .post (url , data = data , files = file_elements )
8283 if response .status_code != 200 :
83- raise OpenMLServerError (( 'Status code: %d \n ' % response . status_code ) + response . text )
84+ raise _parse_server_exception ( response )
8485 if 'Content-Encoding' not in response .headers or \
8586 response .headers ['Content-Encoding' ] != 'gzip' :
8687 warnings .warn ('Received uncompressed content from OpenML for %s.' % url )
@@ -97,8 +98,23 @@ def _read_url(url, data=None):
9798 response = requests .post (url , data = data )
9899
99100 if response .status_code != 200 :
100- raise OpenMLServerError (( 'Status code: %d \n ' % response . status_code ) + response . text )
101+ raise _parse_server_exception ( response )
101102 if 'Content-Encoding' not in response .headers or \
102103 response .headers ['Content-Encoding' ] != 'gzip' :
103104 warnings .warn ('Received uncompressed content from OpenML for %s.' % url )
104105 return response .text
106+
107+ def _parse_server_exception (response ):
108+ # OpenML has a sopisticated error system
109+ # where information about failures is provided. try to parse this
110+ try :
111+ server_exception = xmltodict .parse (response .text )
112+ except :
113+ raise OpenMLServerError (('Status code: %d\n ' % response .status_code ) + response .text )
114+
115+ code = int (server_exception ['oml:error' ]['oml:code' ])
116+ message = server_exception ['oml:error' ]['oml:message' ]
117+ additional = None
118+ if 'oml:additional_information' in server_exception ['oml:error' ]:
119+ additional = server_exception ['oml:error' ]['oml:additional_information' ]
120+ return OpenMLServerException (code , message , additional )
0 commit comments