Ohif 168 proper error handling (#111)

* Adding a better error handling for DICOMWeb getJson method

* Adding a better error handling for DICOMWeb getBulkData method

* Fixinf some typos. Using console.error to log errors

* Better error handling for DIMSE connections

* Using meteor error in StudyListSearch to better display same error in the client

* Using Meteor.Error for a better pattern. Added an error message in the study list. created connection error types to DICOMWeb connection errors

* Changing error types for server connection. Added better errors for DIMSE server on sockets

* Improving viewer response to error being throw when not finding server to display studies

* OHIF-168: adding catches clauses for retrieveStudyMetada method

* OHIF-168: fixing typo in DIMSE.js

* OHIF-168: setting the session variable  to false when starting a new studylist search

* OHIF-168: Using OHIF.log instead of console

* OHIF-168: removing parsing into string for OHIF.log in Connection.js

* OHIF-168: improving error message visibility in study viewer
This commit is contained in:
André Botelho Almeida authored and Erik Ziegler committed 2017-09-19 17:44:39 +02:00
1 parent 4c5dcfeab0
commit af4b8b45f5
18 files changed
+285 -88

No files matched your search

@@ -80,9 +80,13 @@
{{#if session "showLoadingText"}}
{{>loadingText}}
{{else}}
{{#unless numberOfStudies}}
<div class="notFound">No matching results</div>
{{/unless}}
{{#if session "serverError"}}
<div class="notFound">There was an error fetching studies</div>
{{else}}
{{#unless numberOfStudies}}
<div class="notFound">No matching results</div>
{{/unless}}
{{/if}}
{{/if}}
</div>
</template>
@@ -7,6 +7,7 @@ import { moment } from 'meteor/momentjs:moment';
import { OHIF } from 'meteor/ohif:core';
Session.setDefault('showLoadingText', true);
Session.setDefault('serverError', false);
Template.studylistResult.helpers({
/**
@@ -132,6 +133,9 @@ function search() {
// Show loading message
Session.set('showLoadingText', true);
// Hiding error message
Session.set('serverError', false);
// Create the filters to be used for the StudyList Search
filter = {
patientName: getFilter($('input#patientName').val()),
@@ -152,14 +156,27 @@ function search() {
Meteor.call('StudyListSearch', filter, (error, studies) => {
OHIF.log.info('StudyListSearch');
// Hide loading text
Session.set('showLoadingText', false);
if (error) {
OHIF.log.warn(error);
Session.set('serverError', true);
const errorType = error.error;
if (errorType === 'server-connection-error') {
OHIF.log.error('There was an error connecting to the DICOM server, please verify if it is up and running.');
} else if (errorType === 'server-internal-error') {
OHIF.log.error('There was an internal error with the DICOM server');
} else {
OHIF.log.error('For some reason we could not list the studies.')
}
OHIF.log.error(error.stack);
return;
}
// Hide loading text
Session.set('showLoadingText', false);
if (!studies) {
OHIF.log.warn('No studies found');
return;
@@ -53,7 +53,7 @@ export class OHIFStudyMetadataSource extends OHIF.viewerbase.StudyMetadataSource
OHIFStudyMetadataSource._updateStudyCollections(studyMetadata);
resolve(studyMetadata);
}, reject);
}).catch(reject);
});
}
@@ -43,6 +43,11 @@ queryStudiesWithProgress = function(studiesToQuery) {
dialog.done(studiesQueried);
}, () => {
dialog.cancel();
}).catch(error => {
OHIF.log.error('There was an error retrieving all studies metadeta.');
OHIF.log.error(error.stack);
OHIF.log.trace();
});
}
}
@@ -34,8 +34,20 @@ OHIF.studylist.retrieveStudyMetadata = (studyInstanceUid, seriesInstanceUids) =>
console.timeEnd('retrieveStudyMetadata');
if (error) {
OHIF.log.error(error);
reject(error);
const errorType = error.error;
let errorMessage = '';
if (errorType === 'server-connection-error') {
errorMessage = 'There was an error connecting to the DICOM server, please verify if it is up and running.'
} else if (errorType === 'server-internal-error') {
errorMessage = `There was an internal error with the DICOM server getting metadeta for ${studyInstanceUid}`;
} else {
errorMessage = `For some reason we could not retrieve the study\'s metadata for ${studyInstanceUid}.`;
}
OHIF.log.error(errorMessage);
OHIF.log.error(error.stack);
reject(`GetStudyMetadata: ${errorMessage}`);
return;
}
@@ -14,13 +14,19 @@ Meteor.methods({
const server = OHIF.servers.getCurrentServer();
if (!server) {
throw 'No properly configured server was available over DICOMWeb or DIMSE.';
throw new Meteor.Error('improper-server-config', 'No properly configured server was available over DICOMWeb or DIMSE.');
}
if (server.type === 'dicomWeb') {
return Services.WADO.RetrieveMetadata(server, studyInstanceUid);
} else if (server.type === 'dimse') {
return Services.DIMSE.RetrieveMetadata(studyInstanceUid);
try {
if (server.type === 'dicomWeb') {
return Services.WADO.RetrieveMetadata(server, studyInstanceUid);
} else if (server.type === 'dimse') {
return Services.DIMSE.RetrieveMetadata(studyInstanceUid);
}
} catch (error) {
OHIF.log.trace();
throw error;
}
}
});
@@ -13,13 +13,19 @@ Meteor.methods({
const server = OHIF.servers.getCurrentServer();
if (!server) {
throw 'No properly configured server was available over DICOMWeb or DIMSE.';
throw new Meteor.Error('improper-server-config', 'No properly configured server was available over DICOMWeb or DIMSE.');
}
if (server.type === 'dicomWeb') {
return Services.QIDO.Studies(server, filter);
} else if (server.type === 'dimse') {
return Services.DIMSE.Studies(filter);
try {
if (server.type === 'dicomWeb') {
return Services.QIDO.Studies(server, filter);
} else if (server.type === 'dimse') {
return Services.DIMSE.Studies(filter);
}
} catch (error) {
OHIF.log.trace();
throw error;
}
}
});
@@ -1,3 +1,5 @@
import { OHIF } from 'meteor/ohif:core';
/**
* Creates a QIDO URL given the server settings and a study instance UID
* @param server
@@ -69,15 +71,24 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
* Retrieve a set of instances using a QIDO call
* @param server
* @param studyInstanceUid
* @throws ECONNREFUSED
* @returns {{wadoUriRoot: String, studyInstanceUid: String, seriesList: Array}}
*/
Services.QIDO.Instances = function(server, studyInstanceUid) {
var url = buildUrl(server, studyInstanceUid);
var result = DICOMWeb.getJSON(url, server.requestOptions);
return {
wadoUriRoot: server.wadoUriRoot,
studyInstanceUid: studyInstanceUid,
seriesList: resultDataToStudyMetadata(server, studyInstanceUid, result.data)
};
try {
var result = DICOMWeb.getJSON(url, server.requestOptions);
return {
wadoUriRoot: server.wadoUriRoot,
studyInstanceUid: studyInstanceUid,
seriesList: resultDataToStudyMetadata(server, studyInstanceUid, result.data)
};
} catch (error) {
OHIF.log.trace();
throw error;
}
};
@@ -1,3 +1,5 @@
import { OHIF } from 'meteor/ohif:core';
/**
* Creates a QIDO date string for a date range query
* Assumes the year is positive, at most 4 digits long.
@@ -91,6 +93,14 @@ function resultDataToStudies(resultData) {
Services.QIDO.Studies = function(server, filter) {
var url = filterToQIDOURL(server, filter);
var result = DICOMWeb.getJSON(url, server.requestOptions);
return resultDataToStudies(result.data);
try {
var result = DICOMWeb.getJSON(url, server.requestOptions);
return resultDataToStudies(result.data);
} catch (error) {
OHIF.log.trace();
throw error;
}
};
@@ -1,3 +1,4 @@
import { OHIF } from 'meteor/ohif:core';
import { parseFloatArray } from '../../lib/parseFloatArray';
/**
@@ -148,7 +149,7 @@ function getPaletteColors(server, instance, lutDescriptor) {
paletteColorCache.add(entry);
}
} catch (error) {
console.log(`(${error.name}) ${error.message}`);
OHIF.log.error(`(${error.name}) ${error.message}`);
}
}
@@ -339,15 +340,21 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) {
Services.WADO.RetrieveMetadata = function(server, studyInstanceUid) {
var url = buildUrl(server, studyInstanceUid);
var result = DICOMWeb.getJSON(url, server.requestOptions);
try {
var result = DICOMWeb.getJSON(url, server.requestOptions);
var study = resultDataToStudyMetadata(server, studyInstanceUid, result.data);
if (!study) {
study = {};
}
study.wadoUriRoot = server.wadoUriRoot;
study.studyInstanceUid = studyInstanceUid;
return study;
} catch (error) {
OHIF.log.trace();
var study = resultDataToStudyMetadata(server, studyInstanceUid, result.data);
if (!study) {
study = {};
throw error;
}
study.wadoUriRoot = server.wadoUriRoot;
study.studyInstanceUid = studyInstanceUid;
return study;
};