[ 
https://issues.apache.org/jira/browse/NET-278?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12712003#action_12712003
 ] 

Theuns Cloete commented on NET-278:
-----------------------------------

I agree with Sebb that throwing an excpeption is a good idea, because then you 
can log it. I do however have a different problem with the disconnect() methods 
of commons-net:

For easy reference, the SocketClient.disconnect() and 
SocketClient._connectAction() methods are given:
public void disconnect() throws IOException
{
        if (_socket_ != null) _socket_.close();
        if (_input_ != null) _input_.close();
        if (_output_ != null) _output_.close();
        if (_socket_ != null) _socket_ = null;
        _input_ = null;
        _output_ = null;
}

and

protected void _connectAction_() throws IOException
{
        _socket_.setSoTimeout(_timeout_);
        _input_ = _socket_.getInputStream();
        _output_ = _socket_.getOutputStream();
}

>From the Java 6 SDK, the _socket_.close() method is also responsible for 
>closing the input and output streams. But if _socket_.close() throws an 
>IOException before the streams could be closed, the streams will remain open 
>and they will also not be set to null. We need a way to ensure that the input 
>and output streams are also closed. There are various ways to achieve this:

Proposal 1:
Implement a public SocketClient.paranoidDisconnect() method that makes sure the 
_socket_, _input_ and _output_ are closed:
    public void paranoidDisconnect() {
        try {
            this.disconnect();
        }
        catch (IOException ioe) {
            // the first thing that SocketClient.disconnect() does is to close 
the _socket_
            // but if that fails, we have to manually close the _input_ and 
_output_ streams
            if (this._input_ != null) {
                try {
                    this._input_.close();
                }
                catch (IOException ioe2) {
                }
            }

            if (this._output_ != null) {
                try {
                    this._output_.close();
                }
                catch (IOException ioe3) {
                }
            }
        }
        finally {
            this._socket_ = null;
            this._input_ = null;
            this._output_ = null;
        }
    }


Proposal 2:
Expose the _socket_, _input_ and _output_ with getter methods, handing the 
responsibility over to the calling application. TelnetClient already exposes 
the _input_ and _output_ streams with getInputStream() and getOutputStream() 
methods respectively.

> FTPClient.disconnect() shouldn't throw IOException
> --------------------------------------------------
>
>                 Key: NET-278
>                 URL: https://issues.apache.org/jira/browse/NET-278
>             Project: Commons Net
>          Issue Type: Improvement
>    Affects Versions: 2.0
>         Environment: All
>            Reporter: Raffaele Sgarro
>            Priority: Minor
>   Original Estimate: 0.08h
>  Remaining Estimate: 0.08h
>
> FTPClient.disconnect() shouldn't throw IOExceptions because it is typically 
> placed in a finally block and it doesn't make much sense to
> try {
> client.disconnect()
> } catch (IOException e) {
> // You can't actually do anything
> }
> What is the purpose of such an exception if nobody can use it? There's 
> nothing we can do if the client couldn't disconnect... You always usa a catch 
> block with a /*do nothing*/ in your samples, so I think it's only an elegant 
> thing to have a try block in a finally block...

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to