Source:
<code>public Future<GetBlobResult> getBlob(String blobId, GetBlobOptions options, Callback<GetBlobResult> callback) { FutureResult<GetBlobResult> futureResult = new FutureResult<>(); handlePrechecks(futureResult, callback); ReadableStreamChannel blobDataChannel = null; BlobInfo blobInfo = null; Exception exception = null; if (blobId == null || blobId.length() != BLOB_ID_SIZE) { completeOperation(futureResult, callback, null, new RouterException("Cannot accept operation because blob ID is invalid", RouterErrorCode.InvalidBlobId)); } else { try { if (deletedBlobs.contains(blobId)) { <START> throw new RouterException("Blob deleted", RouterErrorCode.BlobDeleted); <END> } else if (!blobs.containsKey(blobId)) { throw new RouterException("Blob not found", RouterErrorCode.BlobDoesNotExist); } else { InMemoryBlob blob = blobs.get(blobId); switch (options.getOperationType()) { case Data: blobDataChannel = new ByteBufferRSC(blob.getBlob(options.getRange())); break; case BlobInfo: blobInfo = new BlobInfo(blob.getBlobProperties(), blob.getUserMetadata()); break; case All: blobDataChannel = new ByteBufferRSC(blob.getBlob(options.getRange())); blobInfo = new BlobInfo(blob.getBlobProperties(), blob.getUserMetadata()); break; } } } catch (RouterException e) { exception = e; } catch (Exception e) { exception = new RouterException(e, RouterErrorCode.UnexpectedInternalError); } finally { GetBlobResult operationResult = exception == null ? new GetBlobResult(blobInfo, blobDataChannel) : null; completeOperation(futureResult, callback, operationResult, exception); } } return futureResult; }</code><technical_language>i leave is. Throwing in a try block catching in block awkward (it is ok for functions throw)</technical_language>

Target:
public Future<GetBlobResult> getBlob(String blobId, GetBlobOptions options, Callback<GetBlobResult> callback) { FutureResult<GetBlobResult> futureResult = new FutureResult<>(); handlePrechecks(futureResult, callback); ReadableStreamChannel blobDataChannel = null; BlobInfo blobInfo = null; Exception exception = null; if (blobId == null || blobId.length() != BLOB_ID_SIZE) { completeOperation(futureResult, callback, null, new RouterException("Cannot accept operation because blob ID is invalid", RouterErrorCode.InvalidBlobId)); } else { try { if (deletedBlobs.contains(blobId)) { exception = new RouterException("Blob deleted", RouterErrorCode.BlobDeleted); } else if (!blobs.containsKey(blobId)) { exception = new RouterException("Blob not found", RouterErrorCode.BlobDoesNotExist); } else { InMemoryBlob blob = blobs.get(blobId); switch (options.getOperationType()) { case Data: blobDataChannel = new ByteBufferRSC(blob.getBlob(options.getRange())); break; case BlobInfo: blobInfo = new BlobInfo(blob.getBlobProperties(), blob.getUserMetadata()); break; case All: blobDataChannel = new ByteBufferRSC(blob.getBlob(options.getRange())); blobInfo = new BlobInfo(blob.getBlobProperties(), blob.getUserMetadata()); break; } } } catch (RouterException e) { exception = e; } catch (Exception e) { exception = new RouterException(e, RouterErrorCode.UnexpectedInternalError); } finally { GetBlobResult operationResult = exception == null ? new GetBlobResult(blobInfo, blobDataChannel) : null; completeOperation(futureResult, callback, operationResult, exception); } } return futureResult; }