Remove TRY-CATCH
, if possible - divide script statements into many separate batches with GO
.
TRY-CATCH
reacts on first exception and breaks execution of TRY-block:
If an error occurs in the TRY block, control is passed to another
group of statements that is enclosed in a CATCH block.
https://msdn.microsoft.com/en-us/library/ms175976.aspx
So behaviour of TRY-CATCH is rather opposite to your intention.
GO
sets the end of the batch. Many of errors don't even break the batch, because they have low severity, so for some cases there is no need even to split script into many batches.
As an example here is sample dummy script for testing or some utility purpose (not for production of course) that generates many errors:
create proc SomeProc as
begin
exec('select uknown from non_existent')
end
GO
drop table #test1
drop table #test2
GO
drop table #test3
GO
create table #test1 (id int primary key)
insert into #test1(id)
exec SomeProc
insert into #test
values (1)
insert into #test1
values (1)
GO
insert into #test1
values (11)
insert into #test1
values (11)
insert into #test
values (22)
GO
select * from #test1
GO
drop table #test
GO
drop table #test
drop proc SomeProc
select object_id('SomeProc', 'P')
GO
it does give the output of selects:

and all the messages:
Msg 3701, Level 11, State 5, Line 7 Cannot drop the table '#test2',
because it does not exist or you do not have permission.
Msg 3701,
Level 11, State 5, Line 9 Cannot drop the table '#test3', because it
does not exist or you do not have permission.
Msg 208, Level 16, State
1, Line 11 Invalid object name 'non_existent'.
(0 row(s) affected)
Msg 208, Level 16, State 0, Line 16 Invalid object
name '#test'.
(1 row(s) affected)
Msg 2627, Level 14, State 1, Line 25 Violation of
PRIMARY KEY constraint 'PK__#test1____3213E83FF35979C1'. Cannot insert
duplicate key in object 'dbo.#test1'. The duplicate key value is (11).
The statement has been terminated.
Msg 208, Level 16, State 0, Line 28
Invalid object name '#test'.
(1 row(s) affected)
Msg 3701, Level 11, State 5, Line 33 Cannot drop
the table '#test', because it does not exist or you do not have
permission.
Msg 3701, Level 11, State 5, Line 35 Cannot drop the table
'#test', because it does not exist or you do not have permission.
"My goal is to catch error message from SQL query, log or print then pass it instead of letting it generate a real error." - if "print" is ok then just remove TRY-CATCH
.