2011-09-23 2 views
2

Dans le cas où l'utilisateur entre des données non sur le serveur Web étant accessible par un WSDL, je reçois une erreur:Quelle est la meilleure façon de gérer les exceptions de type SOAP en python

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:ns3="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://soap.rpc.jira.atlassian.com" xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Header/> 
    <ns2:Body> 
     <ns1:getFieldsForEdit> 
     <in0 xsi:type="ns3:string">FmofSimScl</in0> 
     <in1 xsi:type="ns3:string">QA-65000</in1> 
     </ns1:getFieldsForEdit> 
    </ns2:Body> 
</SOAP-ENV:Envelope> 
<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:ns3="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://soap.rpc.jira.atlassian.com" xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Header/> 
    <ns2:Body> 
     <ns1:getIssue> 
     <in0 xsi:type="ns3:string">FmofSimScl</in0> 
     <in1 xsi:type="ns3:string">QA-65000</in1> 
     </ns1:getIssue> 
    </ns2:Body> 
</SOAP-ENV:Envelope> 
Traceback (most recent call last): 
    File "/home/qa/jira-test/.hg/check_jira.py", line 64, in <module> 
    main() 
    File "/home/qa/jira-test/.hg/check_jira.py", line 12, in main 
    commit_text_verified = verify_commit_text(os.popen('hg tip --template "{desc}"')) 
    File "/home/qa/jira-test/.hg/check_jira.py", line 35, in verify_commit_text 
    if CheckForJiraIssueRecord(m_args) == 0: 
    File "/home/qa/jira-test/.hg/check_jira.py", line 58, in CheckForJiraIssueRecord 
    issue = com.run(command_name, logger, jira_env, my_args) 
    File "/home/qa/jira-test/.hg/jira.py", line 1367, in run 
    return self.commands[command].dispatch(logger, jira_env, args) 
    File "/home/qa/jira-test/.hg/jira.py", line 75, in dispatch 
    results = self.run(logger, jira_env, args) 
    File "/home/qa/jira-test/.hg/jira.py", line 174, in run 
    logger.error(decode(e)) 
    File "/home/qa/jira-test/.hg/jira.py", line 1434, in decode 
    str = e.faultstring 
AttributeError: 'WebFault' object has no attribute 'faultstring' 
transaction abort! 
rollback completed 
abort: pretxncommit.jira hook exited with status 1 

est-il un moyen pour gérer cela afin que je puisse écrire ma propre chaîne d'erreur, ou un message d'avertissement à la place de tout cela. Si je désactiver stdout je n'obtenir les données xml, mais je reçois encore:

 
transaction abort! 
rollback completed 
abort: pretxncommit.jira hook exited with status 1 

qui est de Mercurial, mais serait agréable d'avoir une une chaîne d'erreur ajoutée à comme warnings.warn ("% s n'existe pas "% ISSUE_ID)

ok, je regardais dans jira.py et changé en ligne 1434: str = e.faultstring à str = e.fault

et a obtenu:

faultcode = "soapenv:Server.userException" 
    faultstring = "com.atlassian.jira.rpc.exception.RemotePermissionException: This issue does not exist or you don't have permission to view it." 
    detail = 
     (detail){ 
     com.atlassian.jira.rpc.exception.RemotePermissionException = "" 
     hostname = "JIRA" 
     } 
} 

Répondre

1

il a été fixé dans jira.py: changement qu'il decode fonction:


def decode(e): 
    """Process an exception for useful feedback""" 
    # TODO how to log the fact it is an error, but allow info to be unchanged? 
    # TODO now fault not faultstring? 
    # The faultType class has faultcode, faultstring and detail 
    str = e.fault 
    if str == 'com.atlassian.jira.rpc.exception.RemotePermissionException': 
     return "This issue does not exist or you don't have permission to view it" 
    return e.fault 

au lieu de:


def decode(e): 
    """Process an exception for useful feedback""" 
    # TODO how to log the fact it is an error, but allow info to be unchanged? 
    # TODO now fault not faultstring? 
    # The faultType class has faultcode, faultstring and detail 
    str = e.faultstring 
    if str == 'java.lang.NullPointerException': 
     return "Invalid issue key?" 
    return e.faultstring 

+0

Nice job! Sélectionnez votre réponse propriétaire comme la bonne. :) – jathanism

Questions connexes